1.思路
從服務(wù)器下載資源,然后替換當(dāng)前apk中的資源刺彩。那么如何加載當(dāng)前apk以外(如內(nèi)存卡)的資源呢?所以可以先研究一下google源碼中是如何加載當(dāng)前apk中的資源的
2.Resources源碼分析
無論是加載圖片還是顏色資源颤枪,我們都是通過調(diào)用方法getResources()來完成的介粘。此外通過源碼發(fā)現(xiàn)锈至,此方法的實質(zhì)就是創(chuàng)建了一個Resources 對象附井,而它的創(chuàng)建方式有兩種
//android-24源碼中使用此構(gòu)造創(chuàng)建
Resources resources = new Resources(classLoader);
//android-23源碼中使用此構(gòu)造創(chuàng)建
Resources(AssetManager assets, DisplayMetrics metrics, Configuration config);
3.換膚的簡單實現(xiàn)
3.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();
}
//創(chuàng)建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);
}