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 效果图
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);
}