美文网首页
插件化换肤(2)

插件化换肤(2)

作者: EnzoRay | 来源:发表于2021-12-12 21:16 被阅读0次

上一篇文章中我们已经拿到了App中的resId,通过下面的代码可以拿到属性名和类型:

String resName = mAppResources.getResourceEntryName(resId);
String resType = mAppResources.getResourceTypeName(resId);

而属性名和类型在皮肤包中是一样的,通过下面的代码可以拿到皮肤包中对应的id:skinId:

int skinId = mSkinResources.getIdentifier(resName,resType,mSkinPkgName);

怎么拿到皮肤包对应mSkinResources和mSkinPkgName呢?我们可以看看Resources.java类的构造函数:Resources(AssetManager assets, DisplayMetrics metrics, Configuration config),它需要3个参数,后2个参数可以直接获取到,第1个参数需要AssetManager对象,通过下面这段代码获取到mSkinResources和mSkinPkgName,其中skinPath是皮肤包的路径:

            //反射创建AssetManager
            AssetManager assetManager = AssetManager.class.newInstance();
            //资源路径设置
            Method addAssetPath = assetManager.getClass().getMethod("addAssetPath",
                    String.class);
            addAssetPath.invoke(assetManager, skinPath);

            //宿主App的 resources;
            Resources appResource = mContext.getResources();
            //根据当前的设备显示器信息 与 配置(横竖屏、语言等) 创建Resources
            Resources skinResource = new Resources(assetManager, appResource.getDisplayMetrics(),
                    appResource.getConfiguration());

            //获取皮肤包包名
            PackageManager mPm = mContext.getPackageManager();
            PackageInfo info = mPm.getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES);
            String packageName = info.packageName;

这样我们就拿到了mSkinResources和mSkinPkgName, 然后就可以获取到skinId了, 结合上一篇文章中获取到的view,把skinId设置给view即可达到换肤的效果。

换肤步骤总结

1.使用换肤后的资源文件编译出apk,注意资源文件要与换肤前的同名;
2.反射设置mFactorySet为false,自定义类实现LayoutInflater.Factory2接口,重写onCreateView()方法,并将view、AttributeSet、resId等属性保存起来,setFactory2()为这个自定义类,注意这一步要在setContentView()之前调用;
3.根据resId拿到换肤前的resName和resType。传入换肤apk路径,反射创建AssetManager,然后创建Resources,然后通过Resources、resName、resType以及换肤apk的包名拿到换肤后的skinId;
4.根据skinId拿到皮肤中的color和drawable对象,设置资源的属性为皮肤中的color和drawable对象。

相关文章

  • 插件化换肤

    插件化换肤的优点 1)换肤无闪烁,立即生效,无需重启APP,用户体验好2)扩展和维护方便,入侵性小,低耦合3)插件...

  • 插件化换肤(2)

    上一篇文章里面我们已经拿到了App中的resId,通过下面的代码: 可以拿到属性的名字和类型,而属性名和类型在Ap...

  • 初步了解安卓的主题更换

    换肤一般分为两种:插件换肤和主题换肤 插件换肤就是所谓的apk换肤,将需要更换的属性写好打成apk包放在asset...

  • 插件化换肤方案

    插件化换肤,需要考虑两个核心的问题。第一、如何收集到所有需要换肤的View,因为我们需要在换肤的时机中调用这些Vi...

  • 插件化换肤(1)

    如何实现插件化换肤 1.拿到App中要替换的view以及该view在App中的resId 2.通过该view的re...

  • Android Framework层整体执行流程高性能屏幕适配方

    应用场景:自定义View,APK加固,热修复,组件化,插件化,换肤,leakCanary,hilt,jetpack...

  • Android知识点

    1,知识点列表 1.1反射,泛型,源码,设计模式 1.2热更新,热修复,插件化换肤,插件化架构,NDK图片压缩 1...

  • Android热修复原理及实现

    前言 自己之前也做过插件化换肤,涉及到的是插件资源文件的加载;最近看到同事培训的插件化涉及到具体代码的加载;想自己...

  • Android换肤机制

    参考资料: Android换肤技术总结 Android应用程序插件化研究之AssetManager Android...

  • 插件式换肤

    插件式换肤流程:一:采集需要换肤的控件 SkinLayoutInflaterFactoryonCreateView...

网友评论

      本文标题:插件化换肤(2)

      本文链接:https://www.haomeiwen.com/subject/xlnjfrtx.html