Android 获取应用信息—PackageManager

Android 的应用管理主要是通过PackageManagerService来完成的。PackageManagerService服务负责各种APK包的安装、卸载、优化和查询。

PackageManagerService在启动时会扫描所有的APK文件和Jar包,然后把他们的信息读取出来,保存在内存中,这样系统在运行时就能迅速找到各种应用和组件的信息。扫描过程中如果遇到没有优化的文件,还要执行转换工作,将app文件从dex格式转换为oat格式(Android5.0之前是转换为odex格式)。

Android应用管理一 APK包的安装、卸载和优化
(PackageManagerService)

一、使用PackageManagerService

在应用中如果使用PackageManagerService服务,通常调用的是Context 的 getPackageManager() 方法,这个方法返回的是PackageManager对象。

二、PackageManager API

Class for retrieving various kinds of information related to the application packages that are currently installed on the device.

1. packageInfo

public abstract PackageInfo getPackageInfo(String packageName, int flags)根据包名获取对应的PackageInfo

PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getApplicationInfo().packageName, 0);

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

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

ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
                    context.getApplicationInfo().packageName, 0);

ApplicationInfo描述应用程序的基本信息
常见字段:
(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;支持大内存

3. 其它诸如ActivityInfo、ServiceInfo都类似,他们都是继承自ComponentInfo类,唯一可以需要注意的就是各个类中的FLAG标签的含义。

4. For Instance

获得应用名称、版本名称、版本号

public ResultInfo getApplicationInfo(Context context) {
        PackageManager packageManager = context.getPackageManager();
        ApplicationInfo applicationInfo = null;
        PackageInfo packageInfo = null;
        try {
            applicationInfo = packageManager.getApplicationInfo(
                    context.getApplicationInfo().packageName, 0);
            packageInfo = packageManager.getPackageInfo(
                    context.getApplicationInfo().packageName, 0);
        } catch (final PackageManager.NameNotFoundException e) {
        }
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.applicationName = packageManager.getApplicationLabel(
                applicationInfo).toString();//应用名称
        resultInfo.applicationVersionCode = packageInfo.versionCode;
        resultInfo.applicationVersionName = packageInfo.versionName;
        return resultInfo;
    }
    原文作者:本然233
    原文地址: https://blog.csdn.net/qq_35008279/article/details/82999984
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞