基于前文对安卓主题的全面理解,本文将通过活用主题的机制,通过重定向资源文件,达到换肤的效果。这样可以在不更改逻辑,不重新打包应用,只通过R.java中资源文件的id重定向,即可达到美化系统的效果。
先简单介绍下重定向的原理:
1、系统启动时,开机关键的核心服务,开启主题相关服务AssetRedirectionManagerService
该服务是主题的核心,用于重定向系统的资源引用,从而达到替换的效果。
以上列出了该服务的所有方法,主线通过getPackageRedirectionMap-》generatePackageRedirectionMap-》generateExplicitRedirections-》process,将id对应res资源的定向保存在map映射中,我们通过对该map的修改,即可达到替换的效果。
下面具体讲讲主题包开发的流程:
1、任何一个主题包的目录结构都包括Android.mk,AndroidManifest.xml和res文件夹,res大致包含以下内容
anim保存动画文件
color保存颜色值
drawable多用于存放selector文件
drawable-hdpi适配QHD分辨率并向上兼容
drawable-land-hdpi适配QHD横屏分辨率
nodpi适配时不会拉伸图片
drawable-320dp-hdpi适配480p(320*1.5)的手机
drawable-360dp-hdpi适配540p手机
drawable-360dp-xhdpi适配720p(360*2)的手机
drawable-xhdpi适配HD分辨率并向上兼容
drawable-xxhdpi适配FHD分辨率并向上兼容
drawable-zh-rCN-hdpi适配简体中文的资源,多用于图片上有汉字
drawable-zh-rTW-hdpi适配繁体中文的资源
mipmap-hdpi多用于QHD分辨率的应用图标
mipmap-xhdpi多用于HD分辨率的应用图标
values存放strings、dimen、标签形式的color、drawable文件,分辨率适配类似drawable,不赘述
xml存放配置文件和映射关系,该目录具体如下:
android.xml为framework中需要替换的资源,中间两个分别为待办事项和淘宝需要替换的资源,命名均为包名,redirections为重定向字典文件,内容如下:
如淘宝,如要替换淘宝的资源,会从该列表中分析淘宝的包名,对应的关联文件com_taobao_taobao.xml去寻找要替换哪些图片。
在com_taobao_taobao.xml中,我们又看到了需要替换的资源只有icon(为淘宝资源包中图片的名称),要替换为drawable/com_taobao_taobao_icon(为当前主题包中的资源引用)。
而这个图片我们放置在主题包的drawable-hdpi下,这样就完成了整体的替换关系。