Android:当我从最近使用的应用程序按钮关闭应用程序时,不会调用 OnDestroy
Android: OnDestroy isn't called when I close the app from the recent apps button
当我们按下这个按钮时
我们看到了我们没有关闭的应用程序,像这样
但是当我们想要从此屏幕(下图)关闭应用程序时,不会调用 onDestroy() 方法,但是应用程序已关闭。当应用程序以这种方式关闭时,我需要调用 onDestroy() 。我该怎么做?
您应该阅读一些关于 Activity 生命周期的信息。 onDestroy 方法有一个特点,它不会一直被调用。你不能依赖它。
请说明您想要达到的目标,我会尽力提供更好的解决方案。
建议
所以,如果我没理解错的话,我可以建议一件事。启动一个 Service
,它将每 N 秒触发 LocalBroadcast
(这对系统来说并不是很重)。在 Activities
中注册并 BroadcastReceiver
观看此广播。这样你会得到 true
或 false
取决于是否有任何 BroadcastReceiver
可以捕获你的 LocalBroadcast
。如果没有接收者,则检查一些 SharedPreferences
值,指示是否按下 Button
。
如 Android 文档中所述,不保证在退出应用程序时会调用 onDestroy()
。
"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
相反,您可以创建一个服务,当您的活动 运行ning 在其中的任务被销毁时,该服务会收到通知。
创建服务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();
}
}
在清单中声明/注册您的服务(在应用程序标签内,但在任何 activity 标签之外):
<service android:name=".services.ClosingService"
android:stopWithTask="false"/>
指定 stopWithTask="false"
将导致在从进程中删除任务时在您的服务中触发 onTaskRemoved()
方法。
在调用 stopSelf()
销毁服务之前,您可以在此处 运行 关闭应用程序逻辑。
比使用绑定服务更有前途的方法是在中使用activity生命周期回调申请。尽管接受的答案中显示的方法可行,但服务将在后台 运行 直到 activity 终止,这是昂贵的。相反,我建议使用 Application 的实现。
1) 制作一个class 扩展应用程序,然后通过在Manifest 文件中的Application 标签的name 属性中提供其名称来使用它
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"
....
我已经使用 logcat 测试了这种方法,我的 onDestory
没有被调用但是回调中的 onActivityDestroyed
每次我杀死 activity 来自RAM 但 this doc 表示当调用 activity 的 onDestory
时会调用 onActivityDestroyed
但这似乎没有发生。但是,我发现这种方法比使用 services.
更好
当我们按下这个按钮时
我们看到了我们没有关闭的应用程序,像这样
但是当我们想要从此屏幕(下图)关闭应用程序时,不会调用 onDestroy() 方法,但是应用程序已关闭。当应用程序以这种方式关闭时,我需要调用 onDestroy() 。我该怎么做?
您应该阅读一些关于 Activity 生命周期的信息。 onDestroy 方法有一个特点,它不会一直被调用。你不能依赖它。
请说明您想要达到的目标,我会尽力提供更好的解决方案。
建议
所以,如果我没理解错的话,我可以建议一件事。启动一个 Service
,它将每 N 秒触发 LocalBroadcast
(这对系统来说并不是很重)。在 Activities
中注册并 BroadcastReceiver
观看此广播。这样你会得到 true
或 false
取决于是否有任何 BroadcastReceiver
可以捕获你的 LocalBroadcast
。如果没有接收者,则检查一些 SharedPreferences
值,指示是否按下 Button
。
如 Android 文档中所述,不保证在退出应用程序时会调用 onDestroy()
。
"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
相反,您可以创建一个服务,当您的活动 运行ning 在其中的任务被销毁时,该服务会收到通知。
创建服务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();
}
}
在清单中声明/注册您的服务(在应用程序标签内,但在任何 activity 标签之外):
<service android:name=".services.ClosingService"
android:stopWithTask="false"/>
指定 stopWithTask="false"
将导致在从进程中删除任务时在您的服务中触发 onTaskRemoved()
方法。
在调用 stopSelf()
销毁服务之前,您可以在此处 运行 关闭应用程序逻辑。
比使用绑定服务更有前途的方法是在中使用activity生命周期回调申请。尽管接受的答案中显示的方法可行,但服务将在后台 运行 直到 activity 终止,这是昂贵的。相反,我建议使用 Application 的实现。
1) 制作一个class 扩展应用程序,然后通过在Manifest 文件中的Application 标签的name 属性中提供其名称来使用它
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"
....
我已经使用 logcat 测试了这种方法,我的 onDestory
没有被调用但是回调中的 onActivityDestroyed
每次我杀死 activity 来自RAM 但 this doc 表示当调用 activity 的 onDestory
时会调用 onActivityDestroyed
但这似乎没有发生。但是,我发现这种方法比使用 services.