android - Android 12:如何防止更改手机壁纸时重新启动活动?
问题描述
在 Android 12 上,
如果我们打开一个活动
前往手机主屏幕更换壁纸
切换回我们的活动,活动重新开始。
它似乎与 Material 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
,我们Configuration
从Resources
对象中获取电流。(diff.toLong() and 0x80000000) != 0L
将评估true
壁纸更改或类似的东西是否触发了配置更改。还有其他边缘案例——当索尼让谷歌在 2017 年增加对运行时资源覆盖 (RRO) 的支持时,整个“不可阻止的配置更改”就出现了。因此,其中一些“更改系统主题”应用程序可能会触发同样不可阻止的配置更改。
正如Nguyễn Hoài Nam 所说,你可以从onConfigurationChanged()
一个习惯中发现这一点Application
。或者,让您的视图模型保留前一个视图模型Configuration
并将其与onCreate()
您的活动中的当前视图模型进行比较。
我在这篇博文中有更多关于这个问题的信息。AFAIK,没有办法选择退出此配置更改,因此如果您的应用程序旨在避免配置更改,那么您可能会不走运。
推荐阅读
- c++ - 当子类公开继承时,从 unique_ptr 转换为非标量类型
- excel - Word中的VBA样式段落
- angular - 如何在 Angular 中渲染 KaTex 方程?我试过使用 ng-katex 但没有按预期工作
- postgresql - 从组中获取最后一行,限制 PostgreSQL 中的结果数
- ssi - 服务器端包含语法不再适用于 Apache 2.4
- reactjs - Flask socketIO 发出一系列事件
- scala - 创建包含具有整数属性的案例类实例的 DataFrame
- r - 矩阵中特定列的总和
- java - 有没有办法从客户端更新有关 SSLHandshake 异常的服务器?
- python - 如何在 tkinter 中创建与列表框链接的弹出菜单?