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 获得应用程序中或者节点的信息。我们可以通过它来获取我们设置的任何属性,包括theme 、launchMode、launchmode等。常用方法继承至PackageInfo类中的loadIcon()和loadLabel(); ApplicationInfo extends PackageItemInfo 获取一个特定应用程序中节点的信息 FLAG_SYSTEM-->系统应用程序 FLAG_EXTERNAL_STORAGE-->表示该应用安装在sdcard中 常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel(); ResolveInfo 根据节点来获取其上一层目录的信息,通常是、、节点信息。 public ActivityInfo activityInfo 获取 ActivityInfo对象,即或节点信息 public ServiceInfo serviceInfo 获取 ServiceInfo对象,即节点信息 Drawable loadIcon(PackageManager pm) 获得当前应用程序的图像 CharSequence loadLabel(PackageManager pm) 获得当前应用程序的label PackageInfo
Field | Detail | public String packageName | 应用程序包名 | public ActivityInfo[] activities | 所有节点信息 | public ApplicationInfo applicationInfo | 节点信息,only one | public ActivityInfo[] receivers | 所有节点信息,many | public ServiceInfo[] services | 所有节点信息 ,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 getInstalledApplications(int flags) | flag为一般为PackageManager.GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo的flags过滤,得到我们需要的 | public ResolveInfo resolveActivity(Intent intent, int flags) | intent 查询条件,Activity所配置的action和category flags:MATCH_DEFAULT_ONLY:Category必须带有CATEGORY_DEFAULT的Activity;GET_INTENT_FILTERS:匹配Intent条件即可;GET_RESOLVED_FILTER:匹配Intent条件即可;(本质上是Activity). | public ResolveInfo resolveService(Intent intent, int flags) | 参数同上,返回给定条件的ResolveInfo对象(本质上是Service) | public List queryIntentActivities(Intent intent, int flags) | 参数同上,返回给定条件的所有ResolveInfo对象(本质上是Activity)集合对象 | public List 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(); // 普通应用程序列表
systemApps = new ArrayList(); // 系统应用程序列表
// 得到PackageManager对象
PackageManager pm = this.getPackageManager();
// 得到系统安装的所有程序包的PackageInfo对象
List 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);
}
}
}