但是当我们想从这个屏幕(下图)关闭应用程序时,不会调用 onDestroy() 方法,但是应用程序会关闭。当应用程序以这种方式关闭时,我需要调用 onDestroy() 。我怎样才能做到这一点?
3 回答
正如 Android 文档中所指定的,不能保证onDestroy()
在退出应用程序时会调用它。
“在某些情况下,系统会简单地终止活动的托管进程而不调用此方法”
https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29
相反,您可以创建一个服务,当您的活动在其中运行的任务被销毁时,该服务将得到通知。
创建服务类:
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();
}
}
在清单中声明/注册您的服务(在应用程序标签内,但在任何活动标签外):
<service android:name=".services.ClosingService"
android:stopWithTask="false"/>
当从流程中删除任务时,指定stopWithTask="false"
将导致在您的服务中触发该方法。onTaskRemoved()
stopSelf()
在调用销毁服务之前,您可以在此处运行关闭应用程序逻辑。
你应该阅读一些关于 Activity 生命周期的信息。onDestroy 方法有一件事,它不会一直被调用。你不能依赖它。
请指定您要达到的目标,我会尽力提供更好的解决方案。
建议
所以,如果我理解你的话,我可以建议一件事。启动一个每 N 秒Service
触发LocalBroadcast
一次(对系统来说并不是很重)。在 中注册并BroadcastReceiver
为此广播Activities
。这样,您将获得true
或false
取决于是否有任何BroadcastReceiver
可以捕获您的LocalBroadcast
. 如果没有接收器,则检查SharedPreferences
指示是否Button
按下的某个值。
比使用绑定服务更有前途的方法是在Application中使用活动生命周期回调。尽管接受的答案中显示的方法可行,但服务将在后台运行,直到活动终止,这很昂贵。相反,我建议使用您的Application实现。
1)制作一个扩展Application的类,然后通过在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
每次我从 RAM 中杀死活动时都会调用回调,但是这个文档说onActivityDestroyed
当调用onDestory
活动时会调用它,但这似乎没有发生. 但是,我发现这种方法比使用services更好。