Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is onPause guaranteed to be called when an Activity is no longer running?

Tags:

android

I create a new thread in an activity and I rely on onPause() to interrupt the thread. If my app crashes, or the Activity somehow ceases to exist, I want the thread to be killed.

Is Activity/Fragment.onPause() guaranteed to be called when an Activity is no longer running? If not, how can I guarantee the thread in question is killed?

like image 626
oadams Avatar asked May 09 '13 09:05

oadams


People also ask

When onPause of activity is called?

onPause() Called when the system is about to start resuming a previous activity. There are two possible lifecycle methods that will be called after OnPause() : OnResume() will be called if the Activity is to be returned to the foreground. OnStop() will be called if the Activity is being placed in the background.

Which callback is called when the activity is no longer visible?

onStop() This callback is called when the activity is no longer visible. 6.

Is onPause always called before onDestroy?

In such a case, though, any cleanup you expected to be done in onPause() and onStop() will not be executed. Although onDestroy() is the last callback in the lifecycle of an activity, it is worth mentioning that this callback may not always be called and should not be relied upon to destroy resources.

Is onDestroy guaranteed to be called?

onDestroy() is not always called. If called, only part of the code is executed.


2 Answers

If my app crashes

onPause() is not called here, but this shouldn't bother you as your entire app process ceases to exist, inclusive of all threads you have created (UI or otherwise).

Activity somehow ceases to exist

onPause() will be called whenever your Activity is moved to the background from the foreground, which is done in every conceivable way in which your Activity can be shut down, except for your app crashing. However, as I mentioned above, the app crashing will also by default kill your thread.

onPause() is essentially called whenever your Activity is no longer in the foreground. Your Activity may still be alive and in memory after onPause() has been called, but there is no scenario which I can think of in which your Activity is alive and in the background without onPause() being called.

like image 197
Raghav Sood Avatar answered Oct 14 '22 16:10

Raghav Sood


Suppose you have two activities A and B. You navigate from A to B. Activity A goes to background ie activity A is paused. Activity B takes focus ie foreground. When you click back button activity B is popped from back stack and activity A takes focus ie activity A resumes.

When you display a dialog in activity the activity in paused and dialog is displayed on click of back button dialog is dismissed and activity resumes (foreground).

When activity is no longer running it is in background so it is paused. I agree with Raghav Sood to what happens when app crashes.

You should usually use the onPause() callback to:

Stop animations or other ongoing actions that could consume CPU. Commit unsaved changes, but only if users expect such changes to be permanently saved when they leave (such as a draft email). Release system resources, such as broadcast receivers, handles to sensors (like GPS), or any resources that may affect battery life while your activity is paused and the user does not need them.

Note :

Multiple tasks can be held in the background at once. However, if the user is running many background tasks at the same time, the system might begin destroying background activities in order to recover memory, causing the activity states to be lost.

like image 44
Raghunandan Avatar answered Oct 14 '22 16:10

Raghunandan