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

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.

A Way To Monetize Your Kivy Game

While I am building my game, I look for a way to monetize it. This will be my first game, so it is also the first to attempt earning money with an App. I am also not familiar to monetization companies. So, I have done a search to find an appropriate ads network which can be easily integrated with kivy . The first and only company who provides a sdk for kivy is RevMob . I integrated RevMob sdk and tested it. Unfortunately, it doesn't have a good performance and FullScreen Ads crashes. Just links will work. Therefore, RevMob option is not really preferable since ads need to be visually effective. You can also integrate android sdk of any ads network by using pyjnius . In this post, I will show how to use Adbuddiz sdk with kivy.

Encoding multi-dimensional value into 1-D with preserving closeness

After a very long time, this will be my first post. I hope that it will not be the last, and the rest will come. For a project about taxi trajectory prediction, I have applied k-NN algorithm on coordinate sequence of taxi trips. Did I have promising results? Well, it is arguable, but I have discovered some good techniques. One of them is Z-order curve (Figure 1). Figure 1: Four levels of Z-ordering (taken from Wikipedia  page) I was looking for a technique to decrease dimensionality of 2-D coordinate representation (lat-lon) into 1-D . But on this 1-D value, I would like to apply k-NN algorithm. For this purpose, 1-D values must preserve the closeness of two different coordinates. If I do linear ordering of latitude and longitude values, I couldn't achieve this goal, because closeness will depend on only one value which is placed on the right-most. Let's assume I do linear ordering as lat-lon: