Android 12:如何防止activity更换phone壁纸后重启?
Android 12: How to prevent activity restart on changing phone wallpaper?
在 Android 12,
如果我们打开一个activity
转到phone的主屏幕更换壁纸
切换回我们的 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) 的支持时,整个“不可阻止的配置更改”的事情就出现了。因此,其中一些“改变了系统主题" 应用程序可能会触发同样不可阻止的配置更改。
作为 ,您可以从自定义 Application
的 onConfigurationChanged()
中检测到这一点。或者,让您的视图模型保留之前的 Configuration
并将其与 activity.
的 onCreate()
中的当前视图模型进行比较
我在 this blog post 中有更多关于这个问题的信息。据我所知,没有办法选择退出此配置更改,因此如果您的应用旨在避免配置更改,您可能就不走运了。
在 Android 12,
如果我们打开一个activity
转到phone的主屏幕更换壁纸
切换回我们的 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) 的支持时,整个“不可阻止的配置更改”的事情就出现了。因此,其中一些“改变了系统主题" 应用程序可能会触发同样不可阻止的配置更改。
作为 Application
的 onConfigurationChanged()
中检测到这一点。或者,让您的视图模型保留之前的 Configuration
并将其与 activity.
onCreate()
中的当前视图模型进行比较
我在 this blog post 中有更多关于这个问题的信息。据我所知,没有办法选择退出此配置更改,因此如果您的应用旨在避免配置更改,您可能就不走运了。