App crashes when restoring from background after a long time

My application crashes after idling for a long time in the background. I debugged and found the reason that it is crashing is due to a NullPointerException. Exception was due to the fact that the data in the application singleton class is destroyed by the garbage collector when application is in background. I am using static data in each activity throughout my application.

My question is: is there any way to make the data of application class persistent when in background? Or is there any other solution?

  • How to play Audio file Mp3 from the server
  • Android 4.4 Print to PDF without User Involvement
  • how to get Spinner selected item value to string?
  • Can you use a LoaderManager from a Service?
  • Android - Gridview or listview?
  • How to resize AlertDialog on the Keyboard display
  • Related posts:

    Android Testing: UIAutomator vs Espresso
    NestedScrollView and CoordinatorLayout. Issue on Scrolling
    Android Studio: java.io.IOException: An existing connection was forcibly closed by the remote host
    How to get the width and height of an android.widget.ImageView?
    Always show scrollbar for ListView
    Android Studio 0.5.2 Gradle Refresh Project failed
  • getRight, getLeft, getTop returning zero
  • How to: Install Plugin in Android Studio
  • TileProvider method getTile - need to translate x and y to lat/long
  • Binary XML file line #9: Error inflating class fragment
  • Listitem click doesn't work with checkboxes Android
  • Why is GetServerAuthCodeResult Deprecated? How can I do something equivalent in an Installed Application?
  • 5 Solutions collect form web for “App crashes when restoring from background after a long time”

    For more accurate answer you put your code here. On, Android memory is limited so VM can remove any piece of code it think un-necessary.

    Look into Activity life-cycle method, specially into onResume and make sure that you understand that perfectly. So many time application crashes just for not using Activity life-cycle method properly.

    Another important design consideration for Activity is, no matter what happened with persistence data you Activity should display its UI with some default value. So assumption is like this, if i have data i will display if i don’t, i really do not care. Your UI should never ever crash with or without data. You can use String.xml for storing some default value or even in layouts.

    if you still want go with singleton class, which is perfectly fine but make sure you do the following checking every time you try to access your singleton.

    if (instance==null)
        instance=Singleton.getInstance()
    

    your getInstance() method not only return you current instance it will also make sure that

    • it initializes all object and variable
    • other singleton methods as instance method

    Do not statically access data from one Activity to another. It is not good for android specially for the type problem you are facing now and also it is not very good OOP programming practice.

    SharedPreference is good way to persist data, if that meet your requirement go for it.

    if you want to pass data from different Android component like Activity, Service or BroadcastReciever you can put it inside a bundle and and send as intent. And, as always their are SQLLite data storage, file IO etc etc.

    There are several different ways to save data. If it’s something small you could use SharedPreferences. Otherwise perhaps an SQL database?

    Check out http://developer.android.com/guide/topics/data/data-storage.html

    If you can, store it in other methods. If its complex data structures, you may have to restart the app. For example, I have a User singleton in my app that holds login info for my server. I couldn’t save those if I tried- a lot of the data is hidden in AWS variables. What I had to do was detect when we were being relaunched from the home page after being cleaned up (as opposed to just being restarted) and launched my starting activity, then finished the current activity. And I had to add that to every activity in my app.

    Try to avoid using static variables in your application which are causing these kind of issues. Try to save your data in Shared Preferences and use it.

    The Activity is no longer visible thats why it going to onStop() instead of onResume()

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.