PackageManager是用於獲取Android系統中應用程序的信息,查詢Application相關信息(application,activity,receiver,service,provider及相應屬性等)、查詢已安裝應用、增加或刪除permission、清除用戶數據、緩存,代碼段等。AnroidManifest.xml文件節點說明:
AndroidManifest.xml文件中所有節點的基類,提供了這些節點的基本信息:a label、icon、meta-data。它並不直接使用,而是由子類繼承然后調用相應方法。
PackageItemInfo類:
Field | Detail |
public int icon | 獲得該資源圖片在R文件中的值 (對應於android:icon屬性) |
public int labelRes | 獲得該label在R文件中的值(對應於android:label屬性) |
public String name | 獲得該節點的name值 (對應於android:name屬性) |
public String packagename | 獲得該應用程序的包名 (對應於android:packagename屬性) |
Method | Detail |
Drawable loadIcon(PackageManager pm) | 獲得當前應用程序的圖像 |
CharSequence loadLabel(PackageManager pm) | 獲得當前應用程序的label |
ActivityInfo/ServiceInfo extends PackageItemInfo
獲得應用程序中<activity/>或者<receiver/>節點的信息。我們可以通過它來獲取我們設置的任何屬性,包括theme 、launchMode、launchmode等。常用方法繼承至PackageInfo類中的loadIcon()和loadLabel();
ApplicationInfo extends PackageItemInfo
獲取一個特定應用程序中<application>節點的信息
FLAG_SYSTEM-->系統應用程序
FLAG_EXTERNAL_STORAGE-->表示該應用安裝在sdcard中
常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel();
ResolveInfo
根據<intent>節點來獲取其上一層目錄的信息,通常是<activity>、<receiver>、<service>節點信息。
public ActivityInfo activityInfo 獲取 ActivityInfo對象,即<activity>或<receiver>節點信息
public ServiceInfo serviceInfo 獲取 ServiceInfo對象,即<service>節點信息
Drawable loadIcon(PackageManager pm) 獲得當前應用程序的圖像
CharSequence loadLabel(PackageManager pm) 獲得當前應用程序的label
PackageInfo
Field | Detail |
public String packageName | 應用程序包名 |
public ActivityInfo[] activities | 所有<activity>節點信息 |
public ApplicationInfo applicationInfo | <application>節點信息,only one |
public ActivityInfo[] receivers | 所有<receiver>節點信息,many |
public ServiceInfo[] services | 所有<service>節點信息 ,many |
PackageManager
獲得已安裝的應用程序信息 。可以通過context.getPackageManager()方法獲得。
Method | Detail |
public Drawable getApplicationIcon(String packageName) | 根據PackageName獲取應用程序Icon,有重載方法 |
public ApplicationInfo getApplicationInfo(String packageName, int flags) | 根據PackageName獲取ApplicationInfo,flags:該ApplicationInfo是此flags標記,通常可以直接賦予常數0即可 |
public List<ApplicationInfo> getInstalledApplications(int flags) | flag為一般為GET_UNINSTALLED_PACKAGES,那么此時會返回所有ApplicationInfo。我們可以對ApplicationInfo的flags過濾,得到我們需要的 |
public ResolveInfo resolveActivity(Intent intent, int flags) | intent 查詢條件,Activity所配置的action和category |
public ResolveInfo resolveService(Intent intent, int flags) | 參數同上,返回給定條件的ResolveInfo對象(本質上是Service) |
public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) | 參數同上,返回給定條件的所有ResolveInfo對象(本質上是Activity)集合對象 |
public List<ResolveInfo> queryIntentServices(Intent intent, int flags) | 參數同上,返回給定條件的所有ResolveInfo對象(本質上是Service)集合對象 |
Drawable getActivityIcon(ComponentName cn) | 獲取組件名稱對應的Activity的Icon |
Drawable getActivityIcon(Intent intent) | 獲取Intent對應的Icon |
XMLResourceParse getXml(String packageName,int resid,ApplicationInfo ai) | 從指定的包中加載某個xml文件 |
PackageManager還可以獲取安裝包的大小信息,包括緩存大小(cachesize)、數據大小(datasize)、應用程序大小(codesize)
關於安裝包得大小信息封裝在PackageStats類中
Field | Detail |
public long cachesize | 緩存大小 |
public long codesize | 應用程序大小 |
public long datasize | 數據大小 |
public String packageName | 應用包名 |
應用程序總大小=cachesize + codesize + datasize
// 列出普通應用程序 private void loadApps() { customApps = new ArrayList<PackageInfo>(); // 普通應用程序列表 systemApps = new ArrayList<PackageInfo>(); // 系統應用程序列表 // 得到PackageManager對象 PackageManager pm = this.getPackageManager(); // 得到系統安裝的所有程序包的PackageInfo對象 List<PackageInfo> packages = pm.getInstalledPackages(0); for (PackageInfo pi : packages) { // 列出普通應用 if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) { customApps.add(pi); } // 列出系統應用,總是感覺這里設計的有問題,希望高手指點 if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) { systemApps.add(pi); } } }