背景:
在分享了关于Configration如何触发Activity重新recreate文章:
Activity的reLaunch及onConfigurationChanged android源码分析
在文章发布后,就有热情的粉丝朋友进行留言:

这个粉丝反馈在Android 12以后版本,只要设置有Wallpaper切换后,就发现Activity会进行重启问题,问如何规避?
针对这个设置壁纸后会导致Activity进行重启问题,其实在原来公司也有遇到和处理过,所以针对这样一个问题其实还是比较熟悉的。
Android12以后壁纸切换为啥导致Activity重启
先来说说为啥壁纸切换后会导致Activity的进行重启,主要原因还是如下:
android12新增加特殊,增加了monet的功能:
Android 12基于壁纸的主题设置工具“Monet”,将带来的全新主题设置工具可以从壁纸中选择颜色,并根据选择的颜色调整整个系统的配色,包括快捷设置、通知,还有设置菜单中的按钮和滑条等,这个新工具的代号为“Monet”.
上面既可以看出,实际上壁纸切换后导致Activity重启其实属于一个功能,因为壁纸切换后会导致主题颜色等有变化,这样各个Activity相关的控件view等需要跟随壁纸颜色风格走,自然就会导致Activity要重新刷新。
如何屏蔽不让Activity重启?
这里大家可能会说,既然是新功能monet引入导致的Activity重启,那么是否可以考虑直接关闭monet功能呢?
方案1
其实如果说公司产品可以不需要通过任何google的cst等认证来说,直接屏蔽monet功能是完全可以的哈,这里大家可以进行如下修改:
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 49dd574af829..8182bbe2fb9e 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -18,7 +18,7 @@
<resources>
<bool name="are_flags_overrideable">false</bool>
- <bool name="flag_monet">true</bool>
+ <bool name="flag_monet">false</bool>
<!-- People Tile flag -->
<bool name="flag_conversations">false</bool>
屏蔽monet修改其实很简单,只需要到frameworks/base/packages/SystemUI/res/values/flags.xml把flag_monet变成false既可以。
修改验证对比:
修改前:


日志可以看出Launcher进行了重启

修改后:
android/com.android.internal.app.PlatLogoActivity显示指针颜色不会随壁纸变化


events日志可以看出Launcher并没有进行recreate

直接屏蔽缺点即学员作业
上面的方案1直接关闭monet方案有一个比较大缺点就是直接让功能都没有了,最重要是一旦这个功能关闭了,会导致google一些认证测试无法通过,所以正规厂商都不可以直接关闭monet功能。
那么大家还有更好的方案么?这里给各个学员步骤个作业,提出一下几个要求:
目标保留monet功能,但是前台Activity又可以不进行重启在壁纸切换后
1、保留monet功能,不可以直接屏蔽,因为会导致google相关认证不通过
2、需要实现针对让每个app自己Manifest中配置相关属性等来标记自己Activity在壁纸切换后不重启
3、不可以直接关闭切换壁纸时候都不让Activity重启,因为测试的相关Activity可能会检测自己是否重启
更多framework实战干货,请关注下面“千里马学框架”


被折叠的 条评论
为什么被折叠?



