首页 > 解决方案 > Android 12:如何防止更改手机壁纸时重新启动活动?

问题描述

在 Android 12 上,

  1. 如果我们打开一个活动

  2. 前往手机主屏幕更换壁纸

  3. 切换回我们的活动,活动重新开始。

它似乎与 Material You 主题有关。

当我的应用程序进入前台时,我想禁用重新启动活动。有办法吗?

标签: androidandroid-12material-you

解决方案


这是一个非传统的配置更改。通过“非传统”,我的意思是它不能被阻止android:configChanges——无论你喜欢与否,你的活动都会被破坏并重新创建。

如果您有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,我们ConfigurationResources对象中获取电流。(diff.toLong() and 0x80000000) != 0L将评估true壁纸更改或类似的东西是否触发了配置更改。还有其他边缘案例——当索尼让谷歌在 2017 年增加对运行时资源覆盖 (RRO) 的支持时,整个“不可阻止的配置更改”就出现了。因此,其中一些“更改系统主题”应用程序可能会触发同样不可阻止的配置更改。

正如Nguyễn Hoài Nam 所说,你可以从onConfigurationChanged()一个习惯中发现这一点Application。或者,让您的视图模型保留前一个视图模型Configuration并将其与onCreate()您的活动中的当前视图模型进行比较。

我在这篇博文中有更多关于这个问题的信息。AFAIK,没有办法选择退出此配置更改,因此如果您的应用程序旨在避免配置更改,那么您可能会不走运。


推荐阅读