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 onD
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.
More promising approach than using a bound service would be using activity lifecycle callbacks in the Application. Though the approach shown in the accepted answer would work but the service would be running in the background until the activity is terminated which is expensive. Instead, I would suggest the use of your implementation of Application.
1) Make a class extending Application, then use it by providing its name in the name attribute of Application tag in Manifest file
class MusicPlayerApplication: Application() {
private val TAG = MusicPlayerApplication::class.java.simpleName
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
override fun onActivityPaused(activity: Activity?) {
}
override fun onActivityResumed(activity: Activity?) {
}
override fun onActivityStarted(activity: Activity?) {
}
override fun onActivityDestroyed(activity: Activity?) {
Log.d(TAG, "onActivityDestroyed: ")
val activityName = activity!!.localClassName
}
override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
}
override fun onActivityStopped(activity: Activity?) {
}
override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
}
})
}
}
AndroidManifest.xml
<application
android:name=".MusicPlayerApplication"
....
I have tested this approach using logcat, my onDestory
is not getting called but onActivityDestroyed
in the callback is getting called every time I kill the activity from RAM but this doc says that onActivityDestroyed
would be called when onDestory
of an activity is called but that doesn't seem to happen. However, I find this approach better than using services.
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.
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.
Your problem is that onDestroy is only called in aService
. In an Activity
the called method is onPause()
Put simply in your Activity the field:
@Override
public void onPause()
{
//Put your Code here
}