Android获取应用程序信息——PackageManager的基本使用
2016-05-07 22:04
471 查看
在我们实际开发中,我们常需要获取应用的一些信息来使用,比如获取应用程序基本信息、获取permission是否注册等。这些信息获取都借助于Android给我们提供的PackageManager进行获取,这里我们就总结下PackageManager的基本用法。首先看下我们常见的Manifest配置图:
通过上图可以看出,Android给我们的每个节点提供了对应的信息存储实体类,所以这些类中应该存储了对应类别节点的一些信息,我们只需要通过PackageManager获取对应的组件信息即可。一、常见类介绍 1、PackageManager包管理类 获取设备上的安装的应用程序包,一般通过getPackageManager();获取对象。 常用方法:(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo,注意,此处的flags标签: GET_ACTIVITIESGET_GIDSGET_CONFIGURATIONSGET_INSTRUMENTATIONGET_PERMISSIONSGET_PROVIDERSGET_RECEIVERSGET_SERVICESGET_SIGNATURESGET_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节点信息 ![](https://oscdn.geek-share.com/Uploads/Images/Content/201605/3d0fb108cc31a5ca27961abc3f5f69e0)
从上面的图中我们可以看到,已经获取了安装在手机上的所有Package的信息,获得PackageInfo集合,然后编辑PackageInfo可以获取每个Package里的详情信息。由于我们设置的是Activity,所以在对应的PackageInfo中activities中有值。 (2)、Flag = GET_SERVICES
此时,我们的services中就有值,而activities中为null。3、获取指定应用的PackageInfo。 这个需要我们通过getPackageInfo(packName,flag)方法进行获取,其中packName是对应manifest中的package属性值。
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.materialdesigndemo2、获取所有安装的Packages。 (1)、Flag = GET_ACTIVITIESList<PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES);下面是我们获取的结果:
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.NETWORK05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: android05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: android.permission.INTERNET05-07 21:25:03.984 10392-10392/com.kevin.materialdesigndemo D/dsw: 05、获取应用程序中的执行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.MainActivity05-07 21:33:16.524 16730-16730/com.kevin.materialdesigndemo D/dsw:activityInfo: com.kevin.materialdesigndemo05-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 View 事件分发机制梳理
- Android之SurfaceView简介(一)
- android activitymanager
- android(base)Activity启动方法
- Android项目 植物大战僵尸
- android(base)--Activity基本配置
- 关于Android中内容操作数据库失败的原因及修改方法
- Android实现信息安全中凯撒密码技术
- android:screenOrientation属性
- 05Android Studio使用插件推荐
- Android欢迎界面引导页
- 安卓日记——自定义按钮效果
- android 中math常用方法
- Android - Retrofit 基础使用
- 十八、组合设计模式
- 十七、代理设计模式
- 【Android Native Code开发系列】六 一个Native Service的完整示例
- AndroidImageSlider超炫的轮播图效果
- 【Android Native Code开发系列】 五 运行、调试编译的Native Code项目
- 如何将源代码编译后的文件(lib库/bin/jar/apk等)编译到android中