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 观看此广播。这样你会得到 truefalse 取决于是否有任何 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.

更好