Android 12:如何防止activity更换phone壁纸后重启?

Android 12: How to prevent activity restart on changing phone wallpaper?

在 Android 12,

  1. 如果我们打开一个activity

  2. 转到phone的主屏幕更换壁纸

  3. 切换回我们的 activity,activity 重新启动。

似乎与Material你的主题有关。

我想在我的应用进入前台时禁用 activity 的重新启动。有办法吗?

这是一个非传统的配置更改。所谓“非传统”,我的意思是它不能被 android:configChanges 阻止——无论你喜不喜欢,你的 activity 都会被销毁并重新创建。

如果更改前后有 Configuration 个对象,您可以通过在较新的对象上调用 diff() 来确定发生了这种情况 Configuration 将其与旧版本进行比较:

val diff = resources.configuration.diff(vm.originalConfiguration)

Log.d("WallpaperCCTest", "matches CONFIG_ASSETS_PATHS? ${(diff.toLong() and 0x80000000) != 0L}")

这里,vm.originalConfiguration指向旧的Configuration,我们从Resources对象中得到当前的Configuration。如果墙纸更改或类似事件触发了配置更改,(diff.toLong() and 0x80000000) != 0L 将评估为 true。这还有其他极端情况——当索尼在 2017 年 Google 添加对运行时资源覆盖 (RRO) 的支持时,整个“不可阻止的配置更改”的事情就出现了。因此,其中一些“改变了系统主题" 应用程序可能会触发同样不可阻止的配置更改。

作为 ,您可以从自定义 ApplicationonConfigurationChanged() 中检测到这一点。或者,让您的视图模型保留之前的 Configuration 并将其与 activity.

onCreate() 中的当前视图模型进行比较

我在 this blog post 中有更多关于这个问题的信息。据我所知,没有办法选择退出此配置更改,因此如果您的应用旨在避免配置更改,您可能就不走运了。