在我们实际开发中,我们常需要获取应用的一些信息来使用,比如获取应用程序基本信息、获取permission是否注册等。这些信息获取都借助于Android给我们提供的PackageManager进行获取,这里我们就总结下PackageManager的基本用法。

首先看下我们常见的Manifest配置图:


通过上图可以看出,Android给我们的每个节点提供了对应的信息存储实体类,所以这些类中应该存储了对应类别节点的一些信息,我们只需要通过PackageManager获取对应的组件信息即可。

一、常见类介绍     
1、PackageManager包管理类   
获取设备上的安装的应用程序包,一般通过getPackageManager();获取对象。    
常用方法:
(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo,注意,此处的flags标签:
 GET_ACTIVITIES
GET_GIDS
GET_CONFIGURATIONS
GET_INSTRUMENTATION
GET_PERMISSIONS
GET_PROVIDERS
GET_RECEIVERS
GET_SERVICES
GET_SIGNATURES
GET_UNINSTALLED_PACKAGES
(2)、public abstract int[] getPackageGids(String packageName),根据包名获取group-ids

(3)、public abstract PermissionInfo getPermissionInfo(String name, int flags),根据包名和指定的flags获取指定的授权信息

(4)、public abstract List<PermissionGroupInfo> getAllPermissionGroups(int flags);获取所以PermissGroup集合

(5)、public abstract PermissionGroupInfo getPermissionGroupInfo(String name,
    int flags)根据指定的Group名称获取PermissionGroupInfo对象。

(6)、public abstract ApplicationInfo getApplicationInfo(String packageName,
            int flags),根据指定的包名获取ApplicationInfo信息。

(7)、public abstract ActivityInfo getActivityInfo(ComponentName component,
            int flags),根据指定的组件,获取ActivityInfo信息

(8)、public abstract ServiceInfo getServiceInfo(ComponentName component,
            int flags),根据指定组件获取ServiceInfo

(9)、public abstract ProviderInfo getProviderInfo(ComponentName component,
            int flags),根据指定组件名称获取ProviderInfo信息

(10)、public abstract List<PackageInfo> getInstalledPackages(int flags);获取所有安装的PackagInfo信息

(11)、public abstract List<PackageInfo> getPackagesHoldingPermissions(
            String[] permissions, int flags);获取具有特定权限的PackagInfo

(12)、public abstract List<ApplicationInfo> getInstalledApplications(int flags);获取安装的ApplicationInfo信息

(13)、public abstract boolean addPermission(PermissionInfo info);添加权限

(14)、public abstract void removePermission(String name);移除权限

2、PackageInfo用于描述mainfest中所有描述信息。    
常见字段:   
(1)、public String packageName;包名    
(2)、public String[] splitNames;   
(3)、public int versionCode;版本号     
(4)、public String versionName;版本名称    
(5)、public ApplicationInfo applicationInfo;    
(6)、public long firstInstallTime;第一次安装时间   
(7)、public long lastUpdateTime;上次更新时间     
(8)、public ActivityInfo[] activities;所有的Activity信息     
(9)、public ActivityInfo[] receivers; 所有的广播接收者    
(10)、public ServiceInfo[] services;所有的服务信息     
(11)、public ProviderInfo[] providers;获取ContentProvide     
(12)、public PermissionInfo[] permissions;所有的权限信息

2、ApplicationInfo描述应用程序的基本信息,可以通过getApplicationInfo()方法获取该对象。   
常见字段:        
(1)、public String taskAffinity;      
(2)、public String permission;     
(3)、public String processName;       
(4)、public String className;      
(5)、public int descriptionRes;       
(6)、public static final int FLAG_SYSTEM = 1<<0;系统应用    
(7)、public static final int FLAG_EXTERNAL_STORAGE = 1<<18;安装在外部存储卡     
(8)、 public static final int FLAG_LARGE_HEAP = 1<<20;支持大内存

其它诸如ActivityInfo、ServiceInfo都类似,他们都是继承自ComponentInfo类,唯一可以需要注意的就是各个类中的FLAG标签的含义,Flag比较多,需要花较多时间记忆。

二、代码段测试   
1、ApplicationInfo类测试:获取Application节点信息

ApplicationInfo applicationInfo = getApplicationInfo();Log.d("dsw",applicationInfo.className + "\n" +applicationInfo.dataDir+"\n" +applicationInfo.permission + "\n"+ applicationInfo.packageName + "\n"+ applicationInfo.processName + "\n"+ applicationInfo.taskAffinity + "\n"
);

输出结果:
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: null
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: /data/data/com.kevin.materialdesigndemo
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: null
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo
05-07 18:38:19.368 8255-8255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo

2、获取所有安装的Packages。     
(1)、Flag = GET_ACTIVITIES
List<PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES);
下面是我们获取的结果:

从上面的图中我们可以看到,已经获取了安装在手机上的所有Package的信息,获得PackageInfo集合,然后编辑PackageInfo可以获取每个Package里的详情信息。由于我们设置的是Activity,所以在对应的PackageInfo中activities中有值。      
(2)、Flag = GET_SERVICES

此时,我们的services中就有值,而activities中为null。

3、获取指定应用的PackageInfo。     
这个需要我们通过getPackageInfo(packName,flag)方法进行获取,其中packName是对应manifest中的package属性值。

  PackageManager packageManager = getPackageManager();PackageInfo packageInfo = null;try {packageInfo = packageManager.getPackageInfo("com.kevin.materialdesigndemo",PackageManager.GET_ACTIVITIES);Log.d("dsw", packageInfo.packageName + "\n"+ packageInfo.versionName + "\n");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}

这样就可以获取一个应用的PackageInfo信息。

4、获取应用程序中的permission。

PackageManager packageManager = getPackageManager();
try {PermissionInfo permissionInfo = packageManager.getPermissionInfo("android.permission.INTERNET",PermissionInfo.PROTECTION_NORMAL);List<PermissionGroupInfo> list = packageManager.getAllPermissionGroups(PackageManager.PERMISSION_GRANTED);Log.d("dsw",permissionInfo.group + "\n"+ permissionInfo.packageName + "\n"+ permissionInfo.name + "\n"+ permissionInfo.flags + "\n");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();
}

输出结果:
05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: android.permission-group.NETWORK
05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: android
05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: android.permission.INTERNET
05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: 0

5、获取应用程序中的执行AcitivtyInfo。

PackageManager packageManager = getPackageManager();
ComponentName componentName = new ComponentName("com.kevin.materialdesigndemo","com.dsw.demo.MainActivity");
try {ActivityInfo activityInfo = packageManager.getActivityInfo(componentName, PackageManager.GET_ACTIVITIES);Log.d("dsw:activityInfo",activityInfo.name + "\n"+ activityInfo.packageName +"\n"+ activityInfo.targetActivity);
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();
} 

注意这里组装的ComponentName对象,第一个值对应manifest下的package值,第二个是完整的包路径值的Activity的名称。
结果:   
05-07 21:33:16.524 16730-16730/com.kevin.materialdesigndemo D/dsw:activityInfo: com.dsw.demo.MainActivity
05-07 21:33:16.524 16730-16730/com.kevin.materialdesigndemo D/dsw:activityInfo: com.kevin.materialdesigndemo
05-07 21:33:16.524 16730-16730/com.kevin.materialdesigndemo D/dsw:activityInfo: null
补充:获取ServiceInfo、ProviderInfo的方法和这个相同,都是通过指定ComponentName组件进行获取。

PackageManager的参数及使用相关推荐

  1. Android之获取应用程序(包)的大小-----PackageManager的使用(二)

    http://blog.csdn.net/qinjuning/article/details/6892054 通过第一部分 << Android中获取应用程序(包)的信息-----Pack ...

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

    转载:http://blog.csdn.net/qinjuning/article/details/6867806 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename ...

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

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下: 第一部分: 获取应用程序的packagename ...

  4. Android应用程序管理系列(四)—— packagemanager flags 与 packageInfo 

    Android PackageInfo 应用程序信息 1.简述 1 官方解析为 Overall information about the contents of a package. This co ...

  5. Android应用程序管理系列(二)——PackageManager 包管理者

    Android PackageManager 包管理者 1.简述 Android系统为我们提供了很多服务管理的类, 包括ActivityManager.PowerManager(电源管理).Audio ...

  6. Android 系统默认参数的修改

    转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置, ...

  7. android volley 请求参数,android – Volley – 如何发送DELETE请求参数?

    同样的问题在这里,但我找到了解决方案 问题是在com.android.volley.toolbox.HttpClientStack.java中实现createHttpRequest方法,只有在请求方法 ...

  8. ContentProvider--stable参数

    先总结一下,在ActivityThread#acquireProvider(...)获取IContentProvider时,stable参数不影响是否能取得这个IContentProvider.首先这 ...

  9. 百度地图开发参数设置正确,却定位到大西洋海域去了,定位失败解决方案

    我在做百度地图定位时直接定位到大西洋海域去了,查看定位经纬度是,其他地址参数为空,后来才清楚是经纬度获取失败,原因在于 百度地图API在 android 6.0以上机型上需要申请权限 官方百度地图定位 ...

  10. Android 高版本 packageManager.getPackageArchiveInfo 总是返回null

    最近自己写插件时,总是发现packageManager.getPackageArchiveInfo 返回为null,但是自己权限都打开,加载路径也是正确的,到底是为什么呢? packageInfo = ...

最新文章

  1. LaTeX 修改参考文献的方法
  2. POJ - 3846 Mountain Road 动归
  3. SpringBoot+ElementUI实现通用文件下载请求(全流程图文详细教程)
  4. 十、探索性数据分析的图形化探索
  5. C#获取本机IP地址字符串
  6. go newscanner判断文件读取结束_Go单元测试-testing
  7. js语句连接mysql数据库_js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池...
  8. 一场员工高管间的口水战,员工输了
  9. Autorun.inf病毒和qhbpriAppInit_DLLs专杀
  10. 理解 CMOS IMAGE Sensor
  11. 电子计算机机房防雷装置,网络机房防雷方案
  12. oracle设置默认角色,oracle的用户和角色管理
  13. TeamViewer远程访问打开软件黑屏
  14. PS 将图片渐变透明
  15. ansible:jinja2对特殊符号的处理
  16. Linux中awk后面的RS, ORS, FS, OFS 用法
  17. 使用windows命令行 启动WeGame
  18. NTFS的忠实秘书—USN日志
  19. 公司测试部门来了个00后卷王之王,老油条感叹真干不过,但是...
  20. 专业jpg转pdf软件

热门文章

  1. SeaweedFS安装部署
  2. Word使用中常用的快捷键
  3. Tableau-堆积图
  4. 互联网敏捷 Scrum 和项目管理
  5. 元器件保护必备知识——静电防护
  6. python自动拷贝U盘文件(打包成exe)
  7. RCWL-0516微波雷达感应开关
  8. AD13 整个pcb旋转任意角度
  9. Flask深度学习模型服务端部署
  10. 【进阶】python写一个小猫