插件换肤实现的一个思路

1.思路

从服务器下载资源,然后替换当前apk中的资源。那么如何加载当前apk以外(如内存卡)的资源呢?所以可以先研究一下google源码中是如何加载当前apk中的资源的

2.Resources源码分析

无论是加载图片还是颜色资源,我们都是通过调用方法getResources()来完成的。此外通过源码发现,此方法的实质就是创建了一个Resources 对象,而它的创建方式有两种

//android-24源码中使用此构造创建
 Resources resources = new Resources(classLoader);
//android-23源码中使用此构造创建
 Resources(AssetManager assets, DisplayMetrics metrics, Configuration config);

3.换肤的简单实现

3.1 效果图

插件换肤实现的一个思路_第1张图片
gif.gif

3.2 代码

 public void test(){
        Resources superResources = getResources();
        AssetManager asserts = null;
        String dir  = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "skin.skin";
        try {
            //实例化AssetManager对象,并将资源路径传入
            asserts =AssetManager.class.newInstance();
            Method addAssetPath = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
            addAssetPath.invoke(asserts,dir);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //创建Resources对象
        Resources resources = new Resources(asserts,superResources.getDisplayMetrics(),superResources.getConfiguration());
        //得到用于替换的资源id
        int resId = resources.getIdentifier("sucai","mipmap","com.example.administrator.skintestapplication");
        Drawable imageDrawable = resources.getDrawable(resId);
        skinView.setImageDrawable(imageDrawable);
    }

你可能感兴趣的:(插件换肤实现的一个思路)