在我们实际开发中,我们常需要获取应用的一些信息来使用,比如获取应用程序基本信息、获取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组件进行获取。

基本使用就说这么多。

=============
作者:mr_dsw
地址:http://blog.csdn.net/mr_dsw
=============

Android获取应用程序信息——PackageManager的基本使用相关推荐

  1. Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)

    Android获取设备各项信息(设备id.ip地址.APP应用名称.设备名称.运行商.品牌.型号.分辨率.处理器.国家码.系统语言.网络类型.oaid.android版本.操作系统版本.mac地址.应 ...

  2. Android 获取设备各种信息以及其它

    做手机开发,想必都希望获取手机号码吧,android中有一个类android.telephony.TelephonyManager提供这个功能. TelephonyManager tm = (Tele ...

  3. Android 进程 缓存服务,Android获取应用程序大小和缓存的实例代码

    info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawab ...

  4. Android -- 获取设备硬件信息

    Android – 获取设备硬件信息 通过 Build 获取指定字段信息: 信息 方法 例子 主板 Build.BOARD PAR 系统定制商 Build.BRAND HUAWEI 硬件名称 Buil ...

  5. 获取应用程序信息.h

    // //  获取应用程序信息.h //  IOS笔记 // 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选 ...

  6. Android获取歌曲详细信息

    Android获取歌曲详细信息 一.目标 二.实现方案 三.HTML方案 四.JSON方案 五.接下来 六.Finally 在<Android实现歌词笔记构思>时,构思了如何在笔记中添加歌 ...

  7. 从appstore获取应用程序信息

    转自 :   http://hi.baidu.com/yunhuaikong/blog/item/5d877dcf04ce471e92457eaa.html 如何从appstore获取应用程序信息 2 ...

  8. android代码获取应用名称,Android获取应用程序名称(ApplicationName)

    MainActivity如下: package cn.testapplicationname; import android.os.Bundle; import android.widget.Text ...

  9. android获取程序名称,Android获取应用程序名称(ApplicationName)示例

    MainActivity如下: 代码如下: package cn.testapplicationname; import android.os.Bundle; import android.widge ...

  10. Android 获取照片位置信息

    首先,需要读取手机本地的照片信息,可以借助ContentProvider读取本地媒体数据库来获得. 打开DDMS,在data/data/com.android.prividers.media/data ...

最新文章

  1. Java服务定位器模式
  2. python中正确的输入语句x、y=input_语句x=input()执行时,如果从键盘输入12并按回车键,则x的值是( )。_学小易找答案...
  3. Java 三位数的变形
  4. MySQL的root用户修改普通用户密码
  5. adb logcat 保存_adb命令——日志命令详解——全部输出到桌面: adb logcat c:\users\del\desktop\log.txt...
  6. 第二章导数与微分思维导图_线性代数第二章 矩阵 思维导图
  7. C#类、接口、虚方法和抽象方法-抽象类与接口的区别与联系
  8. jQuery Ajax
  9. word把选择答案弄到题目里_word中把选择题的正确答案自动填到括号里技巧
  10. Openwrt笔记-1-校园网连接
  11. 【Docker】Redis 安装使用教程
  12. WPF开发为按钮提供添加,删除和重新排列ListBox内容的功能
  13. 交叉连接、内连接和外连接的区别及使用方式
  14. matlab等距偏置曲线,144 偏置曲线命令详解
  15. 你离大牛就差这10家国内知名的慕课网站。
  16. Potrace 算法与调参相关
  17. 股价狂跌超70%,特斯拉到底怎么了?
  18. 华为手机鸿蒙系统手机_华为鸿蒙系统迎巨大利好,世界首富正式认错,放弃第三大手机系统...
  19. Java Swing 程序设计01
  20. rda分析怎么做_群落分析的冗余分析(RDA)概述

热门文章

  1. 【python三维深度学习】python三维点云从基础到深度学习
  2. 【阿里云生活物联网架构师专题 ③】esp32 sdk 直连接入天猫精灵IOT开放平台,实现天猫精灵找队友零配网功能和语音控制;
  3. java登录验证_java实现登录验证码
  4. Java web登录验证码
  5. 04最大类间方差法(OTSU大津法)
  6. 美团加载Dialog(小人奔跑)
  7. catia之车灯设计
  8. 抖音海外版tiktok404 amp; 简洁国际版apk
  9. Android 分贝测试仪功能,Android最新大厂面试真题总结
  10. 嵌入式系统笔记之声音