换肤的案例有哪些?
- 网易云音乐的换肤
- App的节日换肤,比如:双11、618等
达到的怎样的效果?
- 换肤过程中不闪烁
- app无需重新启动
- 架构独立 (换肤的逻辑在一个单独的
module
中完成) - 无需继承 (采用
AOP
思想,让换肤与我们业务的Activity
分离,不需要在BaseActivity
中集成换肤逻辑代码,实现低耦合的效果)
换肤实现的思路?
- 知道
xml
文件中的View
是如何解析的?- (
XmlResourceParser
解析器和反射创建View
)
- (
- 如何拦截系统的创建
View
流程?- (通过
setFactory2()
方法可以拦截,通过AOP
思想去实现setFactory2()
方法 - 过程中需要用到
反射
技术,将LayoutInflater.java
中的变量mFactorySet
的值置为false
- 具体
AOP
实现是采用registerActivityLifecycleCallbacks
去监听每个Activity
的生命周期,然后在onActivityCreated
中去做setFactory2()
处理 - 同时
setFactory2()
方法中的参数Factory2
需要我们去自定义,然后重写创建View
的流程,然后在onCreateView
方法中去处理换肤逻辑,同时收集需要换肤的View
,下次需要换肤直接遍历这里收集的View
进行换肤.
- (通过
- 拦截系统创建View的流程后怎么做?
- 重写系统创建
View
过程的代码(复制粘贴系统代码
)
- 重写系统创建
- 收集View以及属性
- 每个Activity的View及其属性都需要收集
- 创建皮肤包
- 将皮肤包的
module
通过编译生成皮肤包apk
文件; - 我们可以通过下载皮肤包
apk
文件,将其存放在手机应用目录,然后在自定义Aplication
中进行加载
- 将皮肤包的
- 如何使用皮肤包?
- 系统资源是如何加载的?
Resources
和AssetManager
- 通过
Hook
技术创建一个AssetManager
,专门加载皮肤包资源 - 通过反射
addAssetPath
方法放入皮肤包的路径,从而得到皮肤包资源的AssetManager
- 首先通过
app
的资源id
找到app
的资源名称name
,然后通过app
的资源名称name
找到皮肤包中的额资源id
- 系统资源是如何加载的?
换肤框架用到了观察者
、Hook技术
、反射
技术.