PackageManager的基本使用

PackageManager的基本使用在我们实际开发中,我们常需要获取应用的一些信息来使用,比如获取应用程序基本信息、获取permission是否注册等。这些信息获取都借助于Android给我们提供的PackageManager进行获取,这里我们就总结下PackageManager的基本用法。首先看下我们常见的Manifest配置图:通过上图可以看出,Android给我们的每个节点提供了对应的信息存储实体类,所以这

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

首先看下我们常见的Manifest配置图:
PackageManager的基本使用

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

一、常见类介绍     
1、PackageManager包管理类   
获取设备上的安装的应用程序包,一般通过getPackageManager();获取对象。    
常用方法:
(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo,注意,此处的flags标签:

  •  GET_ACTIVITIES———————-返回该activities所在的包的acitivities信息
  • GET_GIDS——————————返回与该应用有关的所有id,无论直接有关或是嵌套关联。
  • GET_CONFIGURATIONS—————返回硬件PackageInfo首选项的信息。在reqFeatures和featureGroups configPreferences请求的功能
  • GET_INSTRUMENTATION————-返回测试工具所在包的测试工具信息
  • GET_PERMISSIONS——————–返回所在包权限信息
  • GET_PROVIDERS———————–返回该ContentProvider所在的包的ContentProvider信息
  • GET_RECEIVERS————————返回该BroadCast所在的包的BroadCast信息
  • GET_SERVICES————————–返回该Service所在的包的Service信息
  • 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;所有的权限信息

3、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节点信息     

[java] view plain copy

  1. ApplicationInfo applicationInfo = getApplicationInfo();  
  2.  Log.d(“dsw”,applicationInfo.className + “\n” +  
  3.         applicationInfo.dataDir+“\n” +  
  4.         applicationInfo.permission + “\n”  
  5.         + applicationInfo.packageName + “\n”  
  6.         + applicationInfo.processName + “\n”  
  7.         + applicationInfo.taskAffinity + “\n”  
  8. );  
PackageManager的基本使用

输出结果:

[java] view plain copy

  1. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: null  
  2. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: /data/data/com.kevin.materialdesigndemo  
  3. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: null  
  4. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo  
  5. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo  
  6. 0507 18:38:19.368 82558255/com.kevin.materialdesigndemo D/dsw: com.kevin.materialdesigndemo  
PackageManager的基本使用
[java] view plain copy

  1.   
PackageManager的基本使用

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

PackageManager的基本使用

PackageManager的基本使用


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

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

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

[java] view plain copy

  1. PackageManager packageManager = getPackageManager();  
  2.       PackageInfo packageInfo = null;  
  3.       try {  
  4.           packageInfo = packageManager.getPackageInfo(“com.kevin.materialdesigndemo”,  
  5.                   PackageManager.GET_ACTIVITIES);  
  6.           Log.d(“dsw”, packageInfo.packageName + “\n”  
  7.                   + packageInfo.versionName + “\n”  
  8.           );  
  9.       } catch (PackageManager.NameNotFoundException e) {  
  10.           e.printStackTrace();  
  11.   }  
PackageManager的基本使用

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

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

[java] view plain copy

  1. PackageManager packageManager = getPackageManager();  
  2. try {  
  3.        PermissionInfo permissionInfo = packageManager.getPermissionInfo(“android.permission.INTERNET”,  
  4.                     PermissionInfo.PROTECTION_NORMAL);  
  5.        List<PermissionGroupInfo> list = packageManager.getAllPermissionGroups(PackageManager.PERMISSION_GRANTED);  
  6.       Log.d(“dsw”,  
  7.                permissionInfo.group + “\n”  
  8.                + permissionInfo.packageName + “\n”  
  9.                + permissionInfo.name + “\n”  
  10.                + permissionInfo.flags + “\n”  
  11.             );  
  12.     } catch (PackageManager.NameNotFoundException e) {  
  13.             e.printStackTrace();  
  14. }  
PackageManager的基本使用

输出结果:

[java] view plain copy

  1. 0507 21:25:03.984 1039210392/com.kevin.materialdesigndemo D/dsw: android.permission-group.NETWORK  
  2. 0507 21:25:03.984 1039210392/com.kevin.materialdesigndemo D/dsw: android  
  3. 0507 21:25:03.984 1039210392/com.kevin.materialdesigndemo D/dsw: android.permission.INTERNET  
  4. 0507 21:25:03.984 1039210392/com.kevin.materialdesigndemo D/dsw: 0  
PackageManager的基本使用


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

[java] view plain copy

  1. PackageManager packageManager = getPackageManager();  
  2. ComponentName componentName = new ComponentName(“com.kevin.materialdesigndemo”,“com.dsw.demo.MainActivity”);  
  3. try {  
  4.     ActivityInfo activityInfo = packageManager.getActivityInfo(componentName, PackageManager.GET_ACTIVITIES);  
  5.     Log.d(“dsw:activityInfo”,activityInfo.name + “\n”  
  6.         + activityInfo.packageName +“\n”  
  7.         + activityInfo.targetActivity  
  8.     );  
  9. catch (PackageManager.NameNotFoundException e) {  
  10.     e.printStackTrace();  
  11. }   
PackageManager的基本使用


注意这里组装的ComponentName对象,第一个值对应manifest下的package值,第二个是完整的包路径值的Activity的名称。
结果:   

[java] view plain copy

  1. 0507 21:33:16.524 1673016730/com.kevin.materialdesigndemo D/dsw:activityInfo: com.dsw.demo.MainActivity  
  2. 0507 21:33:16.524 1673016730/com.kevin.materialdesigndemo D/dsw:activityInfo: com.kevin.materialdesigndemo  
  3. 0507 21:33:16.524 1673016730/com.kevin.materialdesigndemo D/dsw:activityInfo: null  
PackageManager的基本使用

补充:获取ServiceInfo、ProviderInfo的方法和这个相同,都是通过指定ComponentName组件进行获取。

基本使用就说这么多。

今天的文章PackageManager的基本使用分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23901.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注