Hook源码+插件化实现无闪烁换肤

本文探讨如何实现无闪烁换肤,主要针对差异较大的皮肤切换场景。通过Hook机制和插件化技术,避免Activity重新创建,提高用户体验。详细介绍了创建LayoutInflater.Factory2实例、收集需要换肤的视图、下载资源apk并Hook换肤的步骤,以及在实际项目中的应用场景。
摘要由CSDN通过智能技术生成

现在的移动端应用,在实现功能需求的同时,还会在用户体验上进行突破,以增加用户黏性。例如,很多场景都加入了日/夜间主题切换,或者类似于网易云音乐的换肤。那么,当我们碰到类似的需求时,应该怎么来实现呢?更复杂的场景,需要动态的从网络下载皮肤资源并应用到apk中呢?

对于换肤的场景,大致可以分为两种情况:
1、切换主题护肤:如果只是简单的切换主题,那么涉及到的大部分是背景颜色,字体颜色的改变,则可以通过定义主题的方式来实现。
2、Hook机制换肤:如果是差异比较大的皮肤切换,那么会替换大量的图标、图片等资源,并且如果仍然采用定义主题的方式的话,会有一个缺点就是当切换主题的时候,会导致Activity重新创建,用户体验不好。那么比较常用的方法就是通过Hook机制,实现无闪烁换肤。回到上面提到的场景,网易云音乐app的换肤功能,可以自由切换多个皮肤,那么每一套皮肤都是在发布应用的时候已经打包在apk里的吗?很显然不是的,如果是这样的话,用户下载apk的时候会被吓到的,apk文件得有多大啊。真正的情况是,当用户第一次选择某皮肤时,应用从网络下载对应的资源apk到手机中,然后通过插件化的方式进行换肤。下面我们来模拟这种方式的实现。
首先,我们先熟悉两个概念:
Hook:Hook是钩子的意思,很形象的描述了它的思想。通过反射机制,拦截对应源码的某个实现逻辑,将自己的逻辑再加入到源码中,替换掉原来的逻辑,从而达到某种效果。
插件化:宿主apk是我们需要更新功能的应用,插件一般是以apk的形式从网络获取。我们知道,android虚拟机加载的是.class经过优化后的dex文件,而我们获取到的是apk文件,那么我们就需要类加载器来对apk中的类进行加载。
关于插件化实现换肤的大致步骤:

  • 创建新的LayoutInflater.Factory2实例
  • 收集需要换肤的view
  • 获取插件apk,Hook换肤

ok,下面我们模拟下载一个资源apk,然后将资源apk里的相关资源以换肤的方式表现到宿主应用里。
在我们开发中,用到Adapter会比较多,当我们创建adapter的时候,都会通过LayoutInflater去解析我们写好的item布局xml。我们知道LayoutInflater为布局解析器,将我们写好的xml布局解析并加载到view。在其源码中,存在一个Factory2成员,它是LayoutInflater类内部定义的一个接口。我们可以通过实现该接口,实现里面的onCreateView方法,返回xml里每一个view对象。

public class SkinFactory implements LayoutInflater.Factory2 {
    AppCompatDelegate mDelegate;
    //存储需要换肤的view
    List<SkinView> cacheSkinView = new ArrayList<>();
    //构造方法参数数组
    static final Class<?>[] mContrcSign = new Class[]{Context.class,AttributeSet.class};
    //通过构造方法创建实例时的参数
    final Object[] mContrcArgs = new Object[2];
    //缓存已经创建view
    static final HashMap<String,Constructor<? extends View>> mContrcMap = new HashMap<>();
    //系统中组件的包
    static final String[] prefixs = new String[]{
            "android.widget.",
            "android.view.",
            "android.webkit."
    };

    public void setmDelegate(AppCompatDelegate Delegate){
        this.mDelegate = Delegate;
    }

    @Override
    public View onCreateView(View parent, String name, Context context, Attr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值