簡介
1.根據(jù)該app的pkgName創(chuàng)建context
2.根據(jù)context鞋诗,資源標(biāo)示符秕岛,和資源類型讀取資源班套。
詳細(xì)介紹
1.創(chuàng)建context
public static Context getContextFromPackageName(Context context, String packageName) {
if (packageName == null)
return null;
try {
Context slaveContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
return slaveContext;
} catch (Exception e) { }
return null;
}
使用到的flag除了<code> Context.CONTEXT_IGNORE_SECURITY </code>,還有
<code>Context.CONTEXT_INCLUDE_CODE </code>與<code>Context.CONTEXT_RESTRICTED </code>。
其中<code>Context.CONTEXT_RESTRICTED </code>將會返回一個有限制的context威鹿,它可能會禁用某些特定屬性乞娄。比如:一個與有限制的context想關(guān)聯(lián)的view可能會忽略特定的xml屬性瞬逊。
而<code>Context.CONTEXT_INCLUDE_CODE </code>則會返回一個包含app代碼的context。這意味可以加載代碼到調(diào)用方的進程中去仪或,從而使之可以通過getClassLoader()方法來初始化app的類确镊。設(shè)置這個標(biāo)志位會強制應(yīng)用安全限制到你訪問的app上去。如果被請求的app不能安全地加載到你的進程中去范删,則會拋出java.lang.SecurityException蕾域。如果不設(shè)置這個標(biāo)志位,這個app可以被沒有任何限制地加載,但是在調(diào)用getClassLoader時始終只返回系統(tǒng)默認(rèn)的classloader旨巷。(疑問:class loader都包含什么巨缘?如何獲取呀)
<code>Context.CONTEXT_IGNORE_SECURITY </code>則會在請求context時忽略任何安全限制,始終允許它被加載采呐。相較于使用<code>Context.CONTEXT_INCLUDE_CODE </code>若锁,它并不是那么安全。所以請小心使用懈万。
2.加載res下的資源
public Drawable getResourcesFromApk(String resourceName,Context mApkContext) {
if (mApkContext == null || resourceName == null)
return null;
try {
Resources localResources = mApkContext.getPackageManager().getResourcesForApplication(mApkContext.getPackageName());
int resourceID = localResources.getIdentifier(mApkContext.getPackageName() + ":drawable/" + resourceName, null, null);
Drawable localDrawable = null;
if (resourceID != 0) {
localDrawable = localResources.getDrawable(resourceID);
return localDrawable;
}
return null;
} catch (Exception localNameNotFoundException) {
localNameNotFoundException.printStackTrace();
}
return null;
}
其他資源如int拴清,color,colorStateList会通,string口予,以此類推。
獲取icon與app名稱
//這里的context是對應(yīng)app的context涕侈。
public static Drawable getAppIcon(Context context,String pkgName) {
PackageManager pm = context.getPackageManager();
try {
ApplicationInfo info = pm.getApplicationInfo(pkgName, 0);
return info.loadIcon(pm);//獲取app name調(diào)用loadLabel方法沪停,但是返回結(jié)果可能為null
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
疑問
- 獲取到一個app的context之后,除了獲取資源還可以做什么裳涛?
- 以上三個flag的應(yīng)用場景和區(qū)別分別是什么木张?