Is ondestroy not always called?
Asked Answered
S

3

9

I have put some cache cleaning code in onDestroy of my activity but most of the time the code is not executed unless I explicitly finish the activity via finish().

Edit: Just read onDestroy is called only with finish() or if the system is low on resources. So where do I need to put my cache cleaning code? If I put it in onPause() and the user goes back to the app, the cache is cleared. I am actually storing important temporary files in the cache that should not be deleted in onPause.

Swirl answered 26/10, 2013 at 16:20 Comment(0)
S
16

From Android developer documentation:

protected void onDestroy ()

Added in API level 1 Perform any final cleanup before an activity is destroyed. This can happen either because the activity is finishing (someone called finish() on it, or because the system is temporarily destroying this instance of the activity to save space. You can distinguish between these two scenarios with the isFinishing() method.

Note: do not count on this method being called as a place for saving data! For example, if an activity is editing data in a content provider, those edits should be committed in either onPause() or onSaveInstanceState(Bundle), not here. This method is usually implemented to free resources like threads that are associated with an activity, so that a destroyed activity does not leave such things around while the rest of its application is still running. There are situations where the system will simply kill the activity's hosting process without calling this method (or any others) in it, so it should not be used to do things that are intended to remain around after the process goes away.

You can move your code to onPause() or onStop()

Shererd answered 26/10, 2013 at 16:23 Comment(9)
i store resized images in the cache.. if i flush it onstop()/onpause() and the app resumes, my resized images will be lost.. should i resize them again? it's pretty resource consumingSwirl
It's very simple save your images onStop() then load them onStart()Shererd
i am storing the resized images in a temporary cache folder... the user can either click on a button to save the images or leave the app using back button.... the problem is i want to clean/erase the resized images only when he leaves my appSwirl
ok onPause is called when activity is not visible to the user, so you can put the code there , then restore it onResume.Shererd
so you saying i delete all resized images in onPause and re-create them in onResume? it can happen that there are 500images.....each time it takes some time to resize them, it's not really user friendly imoSwirl
@Swirl My post is an attempt to answer your question about onDestroy() not being called, maybe you should add more code to your post, or start a new question. It's hard to guess your app without code, I don't want to give you a bad advice you know what I mean.Shererd
yup thx for the answer :) managed to recreate the resized images when needed thxSwirl
Another stupid Android decision, nothing to see here. So it turns out you cannot have a single method which is called ONLY when the fragment is actually destroyed. See that onStop is called when the user puts the activity in the background too, that doesn't mean its destroyed. So stupid, who makes these decisions?Silage
This question was for an Activity class, you should read up in Fragment LifeCycle there is the method onDetach()Shererd
D
3

try to use onstop

like this

@Override
    protected void onStop() {
        super.onStop();
       //write your code here
    }
Disagreement answered 26/10, 2013 at 16:25 Comment(1)
but the question is why onDestroy not always called?Vulturine
P
1

ondestroy is mostly called when the system completely removes the activity from memory, or when a user kills the activity, you want to save your data in on pause, as that will always be called before the destroy.

Pyridoxine answered 26/10, 2013 at 16:24 Comment(3)
onDestroy() is not called in the case of a force close.Machicolate
Neither is it called when removing the app via swiping out of recent apps. At least most of the time, sometimes it triggers. I'm really wondering what exactly is supposed to go into this callback.Unwinking
You are right, very odd. "Here is any entry point to clean up resources before an activity is killed - maybe".Synchro

© 2022 - 2024 — McMap. All rights reserved.