对于 Android 12,后退按钮不会导致 onDestroy

Ken*_*ans 8 android android-12

我刚刚开始确保我的应用程序可以在 Android 12 上运行。我注意到(我相信)所有应用程序在按下后退按钮时都会调用 onPause(),但不会调用 onDestroy()。这意味着该应用程序仍在运行。

以前,当按下后退按钮时,onDestroy() 会在 onPause() 之后调用。

对于运行有(实际上必须有)通知的后台服务的人来说,这绝对是一个问题。停止服务通常是在 onDestroy() 中完成的,当然不是在 onPause() 中完成的。由于未调用 onDestroy(),因此服务继续运行并且通知保持有效。如果您选择通知,它会再次显示[正在运行]应用程序。除非通过概述(左)按钮终止进程,否则无法停止服务并因此停止通知。

我还注意到,如果带有服务的应用程序崩溃,则通知会保持不变。这肯定不是我们所期望的行为。

您可以而且显然必须使用概览(左)软按钮终止该进程。

我可以通过实现 onBackPressed 来解决这个问题:

@Override
public void onBackPressed() {
    // This seems to be necessary with Android 12
    // Otherwise onDestroy is not called
    Log.d(TAG, this.getClass().getSimpleName() + ": onBackPressed");
    finish();
    super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个拼凑。

对于其他应用程序来说,它们是否仍在运行可能并不重要。然而,这是意想不到的行为。

稍后添加:这显然是故意的,并且是对之前行为的改变。这篇文章中提到了这一点(感谢@ianhanniballake):

https://developer.android.com/about/versions/12/behavior-changes-all#back-press

我有几个应用程序,并且我已经验证了 Android 12 上的所有应用程序都发生了这种情况。它给那些拥有服务的应用程序带来了问题。

这个问题隐含的问题是如何处理它。我个人正在为这些实现 onBackPressed 并保留其他的。

car*_*lgn 0

我不确定这应该是答案还是评论,因此,考虑到文本的大小,我决定选择答案。

我想出的解决方案是在某些情况onDestroy()下通过从内部完成活动来强制被调用onStop()

就我而言,我常常onDestroy()坚持一些事情。我知道有更好的方法可以做到这一点,但这就是代码的样子,这个快速解决方法至少暂时解决了这个问题:

@Override
protected void onStop() {
    // Try to differentiate a home button press from the screen being turned off
    final PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
    if (powerManager != null && powerManager.isInteractive()) {
        if (webViewHost != null && !webViewHost.isPaused()) {
            // My old/existing logic (for Android < 12)
            finish();
        } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
            // New workaround for Android 12 onwards
            finish();
        }
    }

    super.onStop();
}
Run Code Online (Sandbox Code Playgroud)

这是项目的repo,已经指向创建解决方法的行。