问题描述
Android13 项目壁纸定时轮播时导致前台应用重启。
原因分析:
Android12 系统版本以后添加主题跟随壁纸颜色功能,这个特性叫monet(莫耐)。可以从壁纸中获取颜色,并根据获取的颜色调整整个系统的主题颜色,包括快捷设置、通知,还有设置菜单中的按钮和滑条等;修改壁纸时,由于monet的功能特性,会重启前台应用以适配新的主题色,导致部分应用重启。
解决方案:
1. 代码中注释主题色对比功能,避免触发重启前台应用重启。
frameworks/base/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
....
/**
* Checks if the color scheme in mColorScheme matches the current system palettes.
* @param managedProfiles List of managed profiles for this user.
*/
private boolean colorSchemeIsApplied(Set<UserHandle> managedProfiles) {
//注释逻辑判断,直接返回true
/*final ArraySet<UserHandle> allProfiles = new ArraySet<>(managedProfiles);
allProfiles.add(UserHandle.SYSTEM);
for (UserHandle userHandle : allProfiles) {
Resources res = userHandle.isSystem()
? mResources : mContext.createContextAsUser(userHandle, 0).getResources();
if (!(res.getColor(android.R.color.system_accent1_500, mContext.getTheme())
== mColorScheme.getAccent1().get(6)
&& res.getColor(android.R.color.system_accent2_500, mContext.getTheme())
== mColorScheme.getAccent2().get(6)
&& res.getColor(android.R.color.system_accent3_500, mContext.getTheme())
== mColorScheme.getAccent3().get(6)
&& res.getColor(android.R.color.system_neutral1_500, mContext.getTheme())
== mColorScheme.getNeutral1().get(6)
&& res.getColor(android.R.color.system_neutral2_500, mContext.getTheme())
== mColorScheme.getNeutral2().get(6))) {
return false;
}
}*/
return true;
}
...
2.关闭monet 功能
frameworks/base/packages/SystemUI/res/values/flags.xml
flag_monet 设置为false 即可关闭monet 功能
<bool name="flag_monet">false</bool>
@Override
public void start() {
....
if (!mIsMonetEnabled) { //判断monet功能是否打开
return;
}
....
}
mIsMonetEnabled = featureFlags.isEnabled(Flags.MONET);