插件化换肤思路分析
主要分为五步
1、收集xml数据
2、统计需要换肤的属性
3、制作apk皮肤包
4、读取皮肤包里面的皮肤
5、执行换肤
具体分析
1、利用View的实例化流程,自定义SkinLayoutflaterFactory。
2、①用SkinAttribute记录需要的属性:SkinPair记录一个属性,属性名字–对应的资源id、SkinView表示一个view对应多个属性,用一个List集合存储所有的SkinView、SkinAttribute存储一个xml对应的对个view,同样用一个List集合存储所有的SkinAttribute。然后调用方法public void look(View view,Attribute attrs)记录下view对应的属性。②然后进行apk皮肤包资源加载:
982 ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this)—>2268 ContextImpl context = new ContextImpl—>2270 context.setResources(packageInfo.getResources())—>951 mResources = ResourcesManager.getInstance().getResources(。。。)—>713 return getOrCreateResources(activityToken, key, classLoader)—>607 如果已经缓存就 ResourcesImpl resourcesImpl = findResourcesImplForKeyLocked(key)—>636 ResourcesImpl resourcesImpl = createResourcesImpl(key)—>338 final AssetManager assets = createAssetManager(key)—>279 assets.addAssetPath(key.mResDir)
该方法内调用native方法完成资源加载。
然后调用public void apply()来修改我们app的属性(这里属性的值应该来自皮肤包)。
3、直接生成一个无代码的APK文件即可。
4、用SkinManager中public void loadSkin(String skinPath)
读取资源包信息。
5、SkinManager通知SkinLayoutInflaterFactory更新UI。