「Update」
1、修复杀掉应用后无法生效的问题; 2、增加注释
This commit is contained in:
@@ -78,6 +78,7 @@ public class SkinManager extends Observable {
|
||||
Log.d(TAG, "加载皮肤路径:" + skinPath);
|
||||
|
||||
if (TextUtils.isEmpty(skinPath)) {
|
||||
Log.d(TAG, "还原默认皮肤包,开始换肤……");
|
||||
//还原默认皮肤包
|
||||
SkinPreference.getInstance().setSkin("");
|
||||
SkinResources.getInstance().reset();
|
||||
@@ -90,18 +91,18 @@ public class SkinManager extends Observable {
|
||||
// 加载指定目录下的皮肤
|
||||
else {
|
||||
// 判断是否已经加载同样皮肤,如果已经加载则不再重复加载,防止因为重复加载导致ImageView之类的设置了src、background的控件被重制
|
||||
if (!SkinPreference.getInstance().getSkin().equals(skinPath)) {
|
||||
try {
|
||||
//反射创建AssetManager 与 Resource
|
||||
AssetManager assetManager = AssetManager.class.newInstance();
|
||||
// 资源路径设置 目录或压缩包
|
||||
Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
|
||||
addAssetPath.setAccessible(true);
|
||||
int result = (int) addAssetPath.invoke(assetManager, skinPath);
|
||||
if (result == 0) {
|
||||
Log.e(TAG, "加载皮肤APK失败:" + skinPath);
|
||||
}
|
||||
|
||||
try {
|
||||
Log.d(TAG, "切换的皮肤与之前不一样,开始换肤……");
|
||||
//反射创建AssetManager 与 Resource
|
||||
AssetManager assetManager = AssetManager.class.newInstance();
|
||||
// 资源路径设置 目录或压缩包
|
||||
Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
|
||||
addAssetPath.setAccessible(true);
|
||||
int result = (int) addAssetPath.invoke(assetManager, skinPath);
|
||||
if (result == 0) {
|
||||
Log.e(TAG, "加载皮肤APK失败:" + skinPath);
|
||||
} else {
|
||||
Log.d(TAG, "加载皮肤APK成功:" + skinPath);
|
||||
// 获取当前Resources
|
||||
Resources resources = application.getResources();
|
||||
//根据当前的设备显示器信息 与 配置(横竖屏、语言等) 创建Resources
|
||||
@@ -120,11 +121,9 @@ public class SkinManager extends Observable {
|
||||
setChanged();
|
||||
//通知观察者
|
||||
notifyObservers();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "皮肤已存在,开始换肤……");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,7 +146,7 @@ public class SkinManager extends Observable {
|
||||
File skinFile = skin.getSkinFile(theme);
|
||||
// 判断是否存在
|
||||
if (skinFile.exists()) {
|
||||
Log.e(TAG, "皮肤已存在,开始换肤……skin=" + skin);
|
||||
Log.d(TAG, "皮肤已存在,开始换肤……skin=" + skin);
|
||||
SkinManager.getInstance().loadSkin(skin.getPathLocal());
|
||||
return;
|
||||
}
|
||||
@@ -178,6 +177,8 @@ public class SkinManager extends Observable {
|
||||
//皮肤包的md5校验 防止下载文件损坏(但是会减慢速度。从数据库查询已下载皮肤表数据库中保留md5字段)
|
||||
if (TextUtils.equals(SkinUtils.getSkinMD5(skinFile), skin.md5)) {
|
||||
Log.d(TAG, "DownloadManager 校验成功,修改文件名。");
|
||||
// 加载指定皮肤包
|
||||
SkinManager.getInstance().loadSkin(skin.getPathLocal());
|
||||
// 校验文件签名没问题后删除其他主题
|
||||
deleteFilesExcept(themeDirectory, skin.getSkinFileName());
|
||||
} else {
|
||||
@@ -188,7 +189,6 @@ public class SkinManager extends Observable {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
SkinManager.getInstance().loadSkin(skin.getPathLocal());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -202,7 +202,6 @@ public class SkinManager extends Observable {
|
||||
public void onAlreadyDownloading(String url) {
|
||||
// 处理重复下载的情况
|
||||
Log.w(TAG, "DownloadManager onAlreadyDownloading url=" + url);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
@@ -229,4 +228,16 @@ public class SkinManager extends Observable {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean renameFile(File oldFile, String newFilePath) {
|
||||
File newFile = new File(newFilePath);
|
||||
|
||||
// 如果旧文件不存在,则直接返回 false
|
||||
if (!oldFile.exists()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 尝试重命名文件
|
||||
return oldFile.renameTo(newFile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class SkinPreference {
|
||||
}
|
||||
|
||||
public String getSkin() {
|
||||
return mPref.getString(KEY_SKIN_PATH, null);
|
||||
return mPref.getString(KEY_SKIN_PATH, "");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,11 +21,14 @@ public class SkinResources {
|
||||
|
||||
private static SkinResources instance;
|
||||
|
||||
//APP原始 resources
|
||||
private Resources mAppResources;
|
||||
//皮肤包 resources
|
||||
private Resources mSkinResources;
|
||||
private String mSkinPkgName;
|
||||
|
||||
private boolean isDefaultSkin = true;
|
||||
|
||||
private Resources mAppResources;
|
||||
|
||||
private SkinResources(Context context) {
|
||||
mAppResources = context.getResources();
|
||||
@@ -58,7 +61,10 @@ public class SkinResources {
|
||||
isDefaultSkin = TextUtils.isEmpty(pkgName) || resources == null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 1.通过原始app中的resId(R.color.XX)获取到自己的 名字
|
||||
* 2.根据名字和类型获取皮肤包中的ID
|
||||
*/
|
||||
public int getIdentifier(int resId) {
|
||||
if (isDefaultSkin) {
|
||||
return resId;
|
||||
@@ -133,6 +139,11 @@ public class SkinResources {
|
||||
return totBuffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* 输入主APP的ID,到皮肤APK文件中去找到对应ID的颜色值
|
||||
* @param resId
|
||||
* @return
|
||||
*/
|
||||
public int getColor(int resId) {
|
||||
if (isDefaultSkin) {
|
||||
return mAppResources.getColor(resId);
|
||||
@@ -160,6 +171,8 @@ public class SkinResources {
|
||||
if (isDefaultSkin) {
|
||||
return mAppResources.getDrawable(resId);
|
||||
}
|
||||
//通过 app的resource 获取id 对应的 资源名 与 资源类型
|
||||
//找到 皮肤包 匹配 的 资源名资源类型 的 皮肤包的 资源 ID
|
||||
int skinId = getIdentifier(resId);
|
||||
if (skinId == 0) {
|
||||
return mAppResources.getDrawable(resId);
|
||||
|
||||
Reference in New Issue
Block a user