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:
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?
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.
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
Post a Comment