首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android中获取应用程序(包)的信息-PackageManager的运用(

2012-07-02 
Android中获取应用程序(包)的信息-----PackageManager的使用(Android中获取应用程序(包)的信息-----Packag

Android中获取应用程序(包)的信息-----PackageManager的使用(

Android中获取应用程序(包)的信息-----PackageManager的使用

?

转载:

http://www.cnblogs.com/Ryandroid/archive/2011/11/25/2263226.html

?

获取Android系统中应用程序的信息,主要包括packagename、label、icon、占用大小等。具体分为两个

?部分,计划如下:

????????????第一部分: 获取应用程序的packagename、label、icon等 ;

?????????? ?第二部分:?获取应用程序的占用大小,包括:缓存大小(cachsize)、数据大小(datasize)。

?

?????? 每部分都为您准备了简单丰富的实例,您一定不会错过。

?

??????Android系统为我们提供了很多服务管理的类,包括ActivityManager、PowerManager(电源管理)、AudioManager(音频管理)

等。除此之外,还提供了一个PackageManger管理类,它的主要职责是管理应用程序包。 通过它,我们就可以获取应用程序信息。

?

???? 引入: AnroidManifest.xml文件节点说明:

?????Android中获取应用程序(包)的信息-PackageManager的运用(

一、相关类的介绍

?

????PackageItemInfo类

????? ????说明: AndroidManifest.xml文件中所有节点的基类,提供了这些节点的基本信息:a label、icon、 meta-data。它并不

?????直接使用,而是由子类继承然后调用相应方法。

??????????常用字段

????????????? ?public int icon ????????? 获得该资源图片在R文件中的值 (对应于android:icon属性)

????????????? ?public int labelRes???? 获得该label在R文件中的值(对应于android:label属性)

?????????????? public String name?? 获得该节点的name值?(对应于android:name属性)

?????????????? public?String packagename?? 获得该应用程序的包名?(对应于android:packagename属性)

?????????常用方法

????????????? Drawable? loadIcon(PackageManager pm)????????????? ?获得当前应用程序的图像

????????????? CharSequence? loadLabel(PackageManager pm)???? 获得当前应用程序的label

?

???ActivityInfo类? 继承自 PackageItemInfo

??????????说明: 获得应用程序中<activity/>或者 <receiver />节点的信息 。我们可以通过它来获取我们设置的任何属性,包括

????? theme 、launchMode、launchmode等

?????????????常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()?

?

?? ServiceInfo 类

??????????说明: 同ActivityInfo类似 ,同样继承自 PackageItemInfo,只不过它表示的是<service>节点信息。

?

? ?ApplicationInfo类 继承自? PackageItemInfo

??????? ?说明:获取一个特定引用程序中<application>节点的信息。

?????????字段说明

   ? ?flags字段:?FLAG_SYSTEM 系统应用程序

     ??????????? ? FLAG_EXTERNAL_STORAGE 表示该应用安装在sdcard中

?????????常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()

?

? ResolveInfo类

????????说明:根据<intent>节点来获取其上一层目录的信息,通常是<activity>、<receiver>、<service>节点信息。

???????常用字段

???????????? public? ActivityInfo? activityInfo???? 获取 ActivityInfo对象,即<activity>或<receiver >节点信息

??????????? ?public ServiceInfo?? serviceInfo??? ?获取 ServiceInfo对象,即<activity>节点信息

???????常用方法:?

??????????? ?Drawable loadIcon(PackageManager pm)??????????? ?获得当前应用程序的图像

??????????? ?CharSequence loadLabel(PackageManager pm)??获得当前应用程序的label

?

?PackageInfo类

???????说明:手动获取AndroidManifest.xml文件的信息 。

???????常用字段

?????????? public String????packageName????????????????? ?包名

???????????public ActivityInfo[]???? activities?? ?????????????? ?所有<activity>节点信息

?????????? public ApplicationInfo applicationInfo???????<application>节点信息,只有一个

???????????public?ActivityInfo[]?? ?receivers???????????? ??? ?所有<receiver>节点信息,多个

?????????? public ServiceInfo[]??? services?????????????? ?? 所有<service>节点信息 ,多个

?

PackageManger 类

??????说明: 获得已安装的应用程序信息 。可以通过getPackageManager()方法获得。

??????常用方法

??????????public abstract PackageManager? getPackageManager()???

???????????????功能:获得一个PackageManger对象

?????? ??public abstrac? tDrawable??? getApplicationIcon(StringpackageName)

???????????????参数: packageName 包名

???????????????功能:返回给定包名的图标,否则返回null

?

???????public abstract?ApplicationInfo???getApplicationInfo(String?packageName, int flags)

?

???????????????参数:packagename 包名

?????????????????????? ? ??flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可

???????????????功能:返回该ApplicationInfo对象

?

????????? public abstract?List<ApplicationInfo>? getInstalledApplications(int flags)

???????????????参数:flag为一般为GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo

???????????????????? 的flags过滤,得到我们需要的。

?????????????? 功能:返回给定条件的所有PackageInfo

?

??????????public abstract?List<PackageInfo>? getInstalledPackages(int flags)?

???????????? 参数如上

???? ?????? ?功能:返回给定条件的所有PackageInfo

?

???????public?abstractResolveInfo? 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条件即可

????????????功能 :返回给定条件的ResolveInfo对象(本质上是Activity)?

?

???????public abstract??List<ResolveInfo>? queryIntentActivities(Intent?intent, int flags)

??????????? 参数同上

????????????功能 :返回给定条件的所有ResolveInfo对象(本质上是Activity),集合对象

?

??????public abstract?ResolveInfo? resolveService(Intent?intent, int flags)

?????????? 参数同上

???????????功能 :返回给定条件的ResolveInfo对象(本质上是Service)

?

?????public abstract?List<ResolveInfo>?queryIntentServices(Intent?intent, int flags)

????????? 参数同上

??????????功能 :返回给定条件的所有ResolveInfo对象(本质上是Service),集合对象

?

二、DEMO讲解

?

????????????通过前面的介绍,相信您一定很了解了,本质上来讲,这些XXXInfo类不过是我们在AndroidManifest.XML文件中定义的信息,

知道到这点了,理解起来就不是很难了。

??????? ?下面我透过两个简答的DEMO,来学以致用。

???????????Demo 1: 通过queryIntentActivities()方法,查询Android系统的所有具备ACTION_MAIN和CATEGORY_LAUNCHER

????? 的Intent的应用程序,点击后,能启动该应用,说白了就是做一个类似Home程序的简易Launcher 。

???????? ??Demo 2?:通过getInstalledApplications()方法获取应用,然后对其过滤,查找出我们需要的第三方应用,系统应用,安装在sdcard的应用。

?

? ??? Demo1? :

?????????图:

??????????? ???Android中获取应用程序(包)的信息-PackageManager的运用(

??1 、布局文件: 主要有两个:带listview的browse_app_list.xml文件 ;listview的项browse_app_item.xml

browse_app_list.xml

?????????Android中获取应用程序(包)的信息-PackageManager的运用(

?

?过滤应用程序如下:

view plainprint?
  1. package?com.qiner.appinfo;?? ??
  2. import?java.util.ArrayList;?? import?java.util.Collections;??
  3. import?java.util.List;?? ??
  4. import?com.qiner.appinfo.R;?? ??
  5. import?android.app.Activity;?? import?android.app.Application;??
  6. import?android.content.pm.ApplicationInfo;?? import?android.content.pm.PackageManager;??
  7. import?android.os.Bundle;?? import?android.view.View;??
  8. import?android.view.View.OnClickListener;?? import?android.widget.Button;??
  9. import?android.widget.ListView;?? ??
  10. public?class?MainActivity?extends?Activity??{?? ??
  11. ????public?static?final?int?FILTER_ALL_APP?=?0;?//?所有应用程序?? ????public?static?final?int?FILTER_SYSTEM_APP?=?1;?//?系统程序??
  12. ????public?static?final?int?FILTER_THIRD_APP?=?2;?//?第三方应用程序?? ????public?static?final?int?FILTER_SDCARD_APP?=?3;?//?安装在SDCard的应用程序??
  13. ?? ????private?ListView?listview?=?null;??
  14. ?? ????private?PackageManager?pm;??
  15. ????private?int?filter?=?FILTER_ALL_APP;??? ????private?List<AppInfo>?mlistAppInfo?;??
  16. ????private?BrowseApplicationInfoAdapter?browseAppAdapter?=?null?;?? ????/**?Called?when?the?activity?is?first?created.?*/??
  17. ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{??
  18. ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.browse_app_list);??
  19. ????????listview?=?(ListView)?findViewById(R.id.listviewApp);?? ????????if(getIntent()!=null){??
  20. ????????????filter?=?getIntent().getIntExtra("filter",?0)?;?? ????????}??
  21. ????????mlistAppInfo?=?queryFilterAppInfo(filter);?//?查询所有应用程序信息?? ????????//?构建适配器,并且注册到listView??
  22. ????????browseAppAdapter?=?new?BrowseApplicationInfoAdapter(this,?mlistAppInfo);?? ????????listview.setAdapter(browseAppAdapter);??
  23. ????}?? ????//?根据查询条件,查询特定的ApplicationInfo??
  24. ????private?List<AppInfo>?queryFilterAppInfo(int?filter)?{?? ????????pm?=?this.getPackageManager();??
  25. ????????//?查询所有已经安装的应用程序?? ????????List<ApplicationInfo>?listAppcations?=?pm??
  26. ????????????????.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);?? ????????Collections.sort(listAppcations,??
  27. ????????????????new?ApplicationInfo.DisplayNameComparator(pm));//?排序?? ????????List<AppInfo>?appInfos?=?new?ArrayList<AppInfo>();?//?保存过滤查到的AppInfo??
  28. ????????//?根据条件来过滤?? ????????switch?(filter)?{??
  29. ????????case?FILTER_ALL_APP:?//?所有应用程序?? ????????????appInfos.clear();??
  30. ????????????for?(ApplicationInfo?app?:?listAppcations)?{?? ????????????????appInfos.add(getAppInfo(app));??
  31. ????????????}?? ????????????return?appInfos;??
  32. ????????case?FILTER_SYSTEM_APP:?//?系统程序?? ????????????appInfos.clear();??
  33. ????????????for?(ApplicationInfo?app?:?listAppcations)?{?? ????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?!=?0)?{??
  34. ????????????????????appInfos.add(getAppInfo(app));?? ????????????????}??
  35. ????????????}?? ????????????return?appInfos;??
  36. ????????case?FILTER_THIRD_APP:?//?第三方应用程序?? ????????????appInfos.clear();??
  37. ????????????for?(ApplicationInfo?app?:?listAppcations)?{?? ????????????????//非系统程序??
  38. ????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?<=?0)?{?? ????????????????????appInfos.add(getAppInfo(app));??
  39. ????????????????}??? ????????????????//本来是系统程序,被用户手动更新后,该系统程序也成为第三方应用程序了??
  40. ????????????????else?if?((app.flags?&?ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)?!=?0){?? ????????????????????appInfos.add(getAppInfo(app));??
  41. ????????????????}?? ????????????}??
  42. ????????????break;?? ????????case?FILTER_SDCARD_APP:?//?安装在SDCard的应用程序??
  43. ????????????appInfos.clear();?? ????????????for?(ApplicationInfo?app?:?listAppcations)?{??
  44. ????????????????if?((app.flags?&?ApplicationInfo.FLAG_EXTERNAL_STORAGE)?!=?0)?{?? ????????????????????appInfos.add(getAppInfo(app));??
  45. ????????????????}?? ????????????}??
  46. ????????????return?appInfos;?? ????????default:??
  47. ????????????return?null;?? ????????}??
  48. ????????return?appInfos;?? ????}??
  49. ????//?构造一个AppInfo对象?,并赋值?? ????private?AppInfo?getAppInfo(ApplicationInfo?app)?{??
  50. ????????AppInfo?appInfo?=?new?AppInfo();?? ????????appInfo.setAppLabel((String)?app.loadLabel(pm));??
  51. ????????appInfo.setAppIcon(app.loadIcon(pm));?? ????????appInfo.setPkgName(app.packageName);??
  52. ????????return?appInfo;?? ????}??
  53. }??



????你可以在此基础上,构建更多丰富的应用。比说说Settings模块中的卸载安装应用程序等。

?

热点排行