Skip to main content

How to keep objects when activity is configured

When activity is reconfigured(e.g. rotating the screen), by default whole activity with its objects will be destoyed and recreated, because Android may need alternative resources to match current screen size. Related explanation on developer.android.com site:


Caution: Your activity will be destroyed and recreated each time 
the user rotates the screen. When the screen changes orientation,
the system destroys and recreates the foreground activity because
the screen configuration has changed and your activity might need
to load alternative resources (such as the layout).

There may be some data in Activity that configured at runtime. Without them, recreation of the activity won't take app to previous state in such situations. So you need to kep this data and reuse them in creation of the activity to keep the state of your program. For data from simple types(e.g. int, string) which can be kept in a bundle, onSaveInstanceState() function is your best. After saving data into bundle, activity is destroyed and same bundle will be available when onCreate() function is called.  Lifecycle of this procedure is shown below:

How about you need to store complex objects like thread or a class which contains many properties which are highly changable at runtime? How about your app need to have only one instance of an object in its all lifecycle? onRetainNonConfigurationInstance() enables you to store one object before activity is destroyed. You can merge any objects into one and keep them. However, this method is deprecated in API level 13. Instead of it,  setRetainInstance(boolean) in Fragment API should be used. This change is a quite enhancement for development, since it is more useful and flexible.

When setRetainInstance(true) is called in onCreate() function of fragment, this fragment will be kept and restored when a configuration of activity is changed. There will be only one call of  onCreate() function of such fragments in their life. So, configuration should be done depending on this behavior. In destroy part of activity, sequentially onPause(), onDestroyView() and onDetach() functions of the fragment will be called but onDestroy()  one, because it will not be destroyed. On restoring state onCreate() method will be skipped and directly onCreateView() function will be called. All properties that existed in this fragment will be still present there.

One point that should be kept in mind is that setRetainInstance(boolean) function may not be used in nested fragments. If there is such hierarchy, this method can be called only in fragments which are not child another fragment. Therefore, to store certain objects of child fragments, passing them to top parent fragment and destroying child ones is the solution. In recreation of child fragments, necessary objects can be fetched via callbacks from top parent fragment.

Comments

Popular posts from this blog

Migration from Proxmox to Openstack

I needed to migrate virtual machines in proxmox to openstack. VMs are in raw format. I needed to take some actions for a succesfull migration. I have perform all actions on Ubuntu 12.04 with virt-manager. qemu-kvm is installed. Here is the list of actions that I took: First, close the machine and copy the image file into your Ubuntu. Convert raw image to qcow2 format: qemu-img convert -O qcow2 image1.raw image1.qcow2 You need the image in qcow2 format for compatibility with openstack platform.  Open the converted image in virt-manager. Before opening, edit disk options. Under ' advanced options ' section, select ' qcow2 ' as ' storage forma t '. Start the virtual machine. You should see the login screen soon. (If you don't set storage format, vm will not find a bootable device. )   If everything is ok so far, close the vm. Take qcow2 image and upload it into glance. It may take time depending on size of it. After this process is completed, open a

Integration of MuPDF Project as a Library into an Android Studio Project

I have needed to use MuPDF library in my android project. After some research, I have seen that there are many integration tutorials but, but integrated projects are developed on Eclipse. For projects on AndroidStudio+Gradle, there is no example. I mean there is no specific example which exactly refers to this issue. So, after achieving my goal, I want to share the steps publicly so that it can be reused by others.

Xposed - How to hook a method with primitive-type parameter

Xposed Framework is a great tool to take actions which Android SDK doesn't provide for developers. One of the great hacks that you can do is hooking a method. You can see parameters given to a method, with many other properties of it. There are some tutorials on Internet, but in this tutorials, they show hooking method without parameters or with class parameters. Its code is: findAndHookMethod("com.android.settings.Settings", lpparam.classLoader, "updateHeaderList", List.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { //your code } });