「Update」

1、修复杀掉应用后无法生效的问题;
2、增加注释
This commit is contained in:
donghongyu
2024-10-23 17:10:54 +08:00
parent 5c42a78ce2
commit 5c94b004ef
4 changed files with 47 additions and 23 deletions

View File

@@ -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);
}
}

View File

@@ -37,7 +37,7 @@ public class SkinPreference {
}
public String getSkin() {
return mPref.getString(KEY_SKIN_PATH, null);
return mPref.getString(KEY_SKIN_PATH, "");
}
}

View File

@@ -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);