「Update」

1、换肤SDK兼容 targetSdkVersion >= 29
2、优化代码结构
This commit is contained in:
donghongyu
2024-10-23 11:42:35 +08:00
parent 37ebe37a25
commit 80578feeca
9 changed files with 230 additions and 207 deletions

View File

@@ -15,13 +15,12 @@ import com.mogo.skin.net.DownloadManager;
import com.mogo.skin.utils.FileUtils;
import com.mogo.skin.utils.SkinPreference;
import com.mogo.skin.utils.SkinResources;
import com.mogo.skin.utils.SkinUtils;
import java.io.File;
import java.lang.reflect.Method;
import java.util.Observable;
import dalvik.system.DexClassLoader;
/**
* donghongyu
*/
@@ -31,9 +30,17 @@ public class SkinManager extends Observable {
private static Application mApplication;
private static SkinManager instance;
/**
* Activity生命周期回调
*/
private SkinActivityLifecycle skinActivityLifecycle;
private Application application;
/**
* 注意首次初始化时需要从配置文件读取使用哪个皮肤,然后应用
*
* @param application
*/
public static void init(Application application) {
synchronized (SkinManager.class) {
if (null == instance) {
@@ -50,9 +57,11 @@ public class SkinManager extends Observable {
private SkinManager(Application application) {
this.application = application;
//记录当前使用的皮肤
SkinPreference.init(application);
//资源管理类 用于从 app/皮肤 中加载资源
SkinResources.init(application);
//注册Activity生命周期回调
//注册Activity生命周期,并设置被观察者
skinActivityLifecycle = new SkinActivityLifecycle();
application.registerActivityLifecycleCallbacks(skinActivityLifecycle);
@@ -61,23 +70,24 @@ public class SkinManager extends Observable {
}
/**
* 载皮肤包 并 更新
* 载皮肤并应用
*
* @param skinPath 皮肤路径
* @param skinPath 皮肤路径 如果为空则使用默认皮肤
*/
public void loadSkin(String skinPath) {
Log.d(TAG, "加载皮肤路径:" + skinPath);
//还原默认皮肤包
if (TextUtils.isEmpty(skinPath)) {
//还原默认皮肤包
SkinPreference.getInstance().setSkin("");
SkinResources.getInstance().reset();
}
// 加载指定目录下的皮肤
else {
try {
// 通过反射获取AssetManager
//反射创建AssetManager 与 Resource
AssetManager assetManager = AssetManager.class.newInstance();
// 获取插件APK的AssetManager
// 资源路径设置 目录或压缩包
Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPath.setAccessible(true);
int result = (int) addAssetPath.invoke(assetManager, skinPath);
@@ -87,13 +97,14 @@ public class SkinManager extends Observable {
// 获取当前Resources
Resources resources = application.getResources();
// 获取皮肤插件的 Resources 横竖、语言
//根据当前的设备显示器信息 与 配置(横竖屏、语言等) 创建Resources
Resources skinResource = new Resources(assetManager, resources.getDisplayMetrics(), resources.getConfiguration());
// 获取外部Apk(皮肤包) 包名
PackageManager mPm = application.getPackageManager();
PackageInfo info = mPm.getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES);
String packageName = info.packageName;
SkinResources.getInstance().applySkin(skinResource, packageName);
//保存当前使用的皮肤包
SkinPreference.getInstance().setSkin(skinPath);
} catch (Exception e) {
@@ -155,7 +166,7 @@ public class SkinManager extends Observable {
if (TextUtils.equals(SkinUtils.getSkinMD5(skinFile), skin.md5)) {
Log.d("SkinActivity", "校验成功,修改文件名。");
// 校验文件签名没问题后删除其他主题
deleteFilesExcept(theme,skin.file.getName());
deleteFilesExcept(theme, skin.file.getName());
} else {
Log.e("SkinActivity", "皮肤文件校验出错,本地文件MD5 与云端文件MD5 不一致。");
Toast.makeText(mApplication, "皮肤文件校验出错,本地文件MD5 与云端文件MD5 不一致。", Toast.LENGTH_SHORT).show();
@@ -172,7 +183,6 @@ public class SkinManager extends Observable {
// 下载失败后的处理
Log.e("DownloadManager", "onDownloadFailed");
e.printStackTrace();
}
@Override