Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: OnDestroy isn't called when I close the app from the recent apps button

When we press this button

We see the apps which we didn't close, like this

But when we want to close an app from this screen (below image), the method onDestroy() isn't called, however the app is closed. I need to call onDestroy() when the app is closed in this way. How can I do this?

like image 477
Curio Avatar asked Jan 19 '17 14:01

Curio


People also ask

Why onDestroy is not called when finished?

onDestroy() should be called at the end because then your code will be called before it is destroyed.

When your app goes into the background it's not guaranteed that onDestroy is called True or false?

As specified in the Android documentation, it is not guaranteed that onDestroy() will be called when exiting your application. Instead, you can create a service which will be notified when the Task your activities are running inside is destroyed.

How do I end an app on Android?

To Close the Application, you can also take "System. exit(0)" 0 is standard or use any exit code.


2 Answers

As specified in the Android documentation, it is not guaranteed that onDestroy() will be called when exiting your application.

"There are situations where the system will simply kill the activity's hosting process without calling this method"

https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

Instead, you can create a service which will be notified when the Task your activities are running inside is destroyed.

Create the service class:

public class ClosingService extends Service {      @Nullable     @Override     public IBinder onBind(Intent intent) {         return null;     }      @Override     public void onTaskRemoved(Intent rootIntent) {         super.onTaskRemoved(rootIntent);          // Handle application closing         fireClosingNotification();          // Destroy the service         stopSelf();     } } 

Declare / register your service in the manifest (within the application tag, but outside any activity tags):

<service android:name=".services.ClosingService"              android:stopWithTask="false"/> 

Specifying stopWithTask="false" will cause the onTaskRemoved() method to be triggered in your service when the task is removed from the Process.

Here you can run your closing application logic, before calling stopSelf() to destroy the Service.

like image 139
Charlie Avatar answered Oct 03 '22 16:10

Charlie


You should read some info about Activity lifecycle. There is one thing about onDestroy method, it doesn't get called all time. You mustn't rely on it.

Specify please what are you trying to achive and I'll try to offer better solution.

Suggestion

So, if I understood you right, I can suggest one thing. Start a Service that will fire LocalBroadcast every N seconds (it's not really heavy to system). Register and BroadcastReceiver for this broadcast in Activities. This way you'll get true or false depending on if there is any BroadcastReceiver that can catch your LocalBroadcast. And if no receivers than check for some SharedPreferences value that indicates if Button was pressed.

like image 34
Ekalips Avatar answered Oct 03 '22 16:10

Ekalips