2.App换肤框架实现原理

换肤的案例有哪些?

  1. 网易云音乐的换肤
  2. App的节日换肤,比如:双11、618等

达到的怎样的效果?

  • 换肤过程中不闪烁
  • app无需重新启动
  • 架构独立 (换肤的逻辑在一个单独的module中完成)
  • 无需继承 (采用AOP思想,让换肤与我们业务的Activity分离,不需要在BaseActivity中集成换肤逻辑代码,实现低耦合的效果)

换肤实现的思路?

  1. 知道xml文件中的View是如何解析的?
    • (XmlResourceParser解析器和反射创建View)
  2. 如何拦截系统的创建View流程?
    • (通过setFactory2()方法可以拦截,通过AOP思想去实现setFactory2()方法
    • 过程中需要用到反射技术,将LayoutInflater.java中的变量mFactorySet的值置为false
    • 具体AOP实现是采用registerActivityLifecycleCallbacks去监听每个Activity的生命周期,然后在onActivityCreated中去做setFactory2()处理
    • 同时setFactory2()方法中的参数Factory2需要我们去自定义,然后重写创建View的流程,然后在onCreateView方法中去处理换肤逻辑,同时收集需要换肤的View,下次需要换肤直接遍历这里收集的View进行换肤.
  3. 拦截系统创建View的流程后怎么做?
    • 重写系统创建View过程的代码(复制粘贴系统代码)
  4. 收集View以及属性
    • 每个Activity的View及其属性都需要收集
  5. 创建皮肤包
    • 将皮肤包的module通过编译生成皮肤包apk文件;
    • 我们可以通过下载皮肤包apk文件,将其存放在手机应用目录,然后在自定义Aplication中进行加载
  6. 如何使用皮肤包?
    • 系统资源是如何加载的? ResourcesAssetManager
    • 通过Hook技术创建一个AssetManager,专门加载皮肤包资源
    • 通过反射addAssetPath方法放入皮肤包的路径,从而得到皮肤包资源的AssetManager
    • 首先通过app的资源id找到app的资源名称name,然后通过app的资源名称name找到皮肤包中的额资源id

换肤框架用到了观察者Hook技术反射技术.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值