package com.v7lin.android.env.skin; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.content.res.Resources; import android.text.TextUtils; /** * * * @author v7lin Email:v7lin@qq.com */ public class SkinFactory { private static final SkinCreator SKIN_CREATOR = new SkinCreator() { @Override public SkinFamily createFrom(Context context, String skinPath) { SkinFamily family = null; try { PackageManager manager = context.getPackageManager(); PackageInfo info = manager.getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES); String skinPkg = info.packageName; Class<?> clazz = AssetManager.class; AssetManager skinAsset = (AssetManager) clazz.newInstance(); Method method = clazz.getDeclaredMethod("addAssetPath", String.class); method.invoke(skinAsset, skinPath); // 由于这里的资源都是非系统级别的,不会被缓存到Resources的static成员常量里 // 即Resources的startPreloading和finishPreloading已在ZygoteInit中被调用完毕,一些启动所需的系统资源被缓存到Resources的static成员常量里 // 所以可以不用EnvThirdResources Resources resources = new Resources(skinAsset, context.getResources().getDisplayMetrics(), context.getResources().getConfiguration()); family = new SkinFamily(skinPath, skinPkg, resources); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return family; } }; public static boolean isValid(SkinFamily family) { boolean isValid = false; try { if (family != null && family.getResources() != null && family.getResources().getAssets() != null) { AssetManager assets = family.getResources().getAssets(); Class<?> clazz = assets.getClass(); Method method = clazz.getDeclaredMethod("isUpToDate"); Object object = method.invoke(assets); isValid = Boolean.valueOf(String.valueOf(object)).booleanValue(); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return isValid; } public static SkinFamily makeSkin(Context context, String skinPath) { SkinFamily family = null; if (!TextUtils.isEmpty(skinPath)) { family = SKIN_CREATOR.createFrom(context, skinPath); } return family; } }