一.系统主题介绍
android P都已经出来好久了,今天在使用Android P过程中发现在Dislpay下面有一个主题设置(Device theme)
如下所示
可以看出一个有3个选项,通过使用后发现,他运行用户设置手机主题,跟app主题不一样,这里的主题设置可以供系统以及所有应用查询.系统主题一共有暗和亮两张状态.上面设置中3个选项代表的意义如下:
- Automatic (base on wallpaper):系统检查当前设置的手机壁纸属于暗还是亮,然后更具判断设置主题
- Light:设置亮主题
- Dark:设置暗主题
设置亮主题:
设置暗主题:
这样看效果还是挺明显的.通过源码发现,目前系统上launche和SystemUI监听了系统主题的状态,然后显示系统的主题,其他app如果需要根据系统当前主题,也需要实时监听主题变化,
二.如何实现系统主题
个人app要监听系统主题,直接使用WallpaperManager,addOnColorsChangedListener方法,通过listener回调
实现步奏如下:
step1:获取WallpaperManager
if (wallpaperManager == null) {
wallpaperManager = WallpaperManager.getInstance(context.getApplicationContext());
}
调用WallpaperManager的单例,实际上就是getSystemService
public static WallpaperManager getInstance(Context context) {
return (WallpaperManager)context.getSystemService(
Context.WALLPAPER_SERVICE);
}
step2:监听主题变化
这个回调方法会在主题切换中触发,下面是触发后调用的方法
WallpaperManager.OnColorsChangedListener onColorsChangedListener = new WallpaperManager.OnColorsChangedListener(){
@Override
public void onColorsChanged(WallpaperColors colors, int which) {//1
if (WallpaperManager.FLAG_SYSTEM == which) {//2
updateTheme(colors);
}
}
};
wallpaperManager.addOnColorsChangedListener(onColorsChangedListene, null);//3
WallpaperColors colorsSystem =