欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过 PackageManager 获得你想要的 App 信息

程序员文章站 2022-04-30 20:16:25
...

PackageManager

介绍

有些场景下,我们会需要获取一些其它 App 的各项信息,例如:App 名称,包名、Icon 等。这个时候就需要使用到 PackageManager 这个类了

你首先需要获取 PackageManager(以下简称 PM) 对象,通过 PM 对象,你就可以获取到你需要的各项 App 的信息类

这里涉及到的 App 信息类包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,还有一个 ResolveInfo 类,它比较特殊一点,不和前面的结构为从属关系

这些类,都可以在根据 AndroidManifest.xml 中定义的组件进行划分,大概的结构如下
通过 PackageManager 获得你想要的 App 信息

获取

在 Context 中,就有获取 PM 对象的方法,getPackageManager(),所以四大组件想要获取它是非常简单的

PM 中,提供了非常多的方法,供我们通过不同的条件,获取到 PackageInfo 对象、ApplicationInfo 对象等

PackageInfo

PackageInfo 从名称上也可以看出来,它主要用于存储获取到的 Package 的一些信息,包括:包名(packageName)、版本号(versionCode)、版本名(versionName)

基本上拿到了 PackageInfo ,你就可以拿到大部分此 Apk 相关的信息了。并且,PackageInfo 中有一个 applicationInfo 的字段,是可以直接获取到与它相关的 ApplicationInfo 对象的

这里介绍几个 PackageInfo 中,比较常用的字段:

  • packageName:包名
  • versionCode:版本号
  • versionName:版本名
  • firstInstallTime:首次安装时间
  • lastUpdateTime:最后一次覆盖安装时间
PackageManager packageManager = getPackageManager();
        PackageInfo packageInfo = null;
        try {
            packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        int labelRes = packageInfo.applicationInfo.labelRes;
        String app_name = getResources().getString(labelRes);
        String packageName = packageInfo.packageName;
        int versionCode = packageInfo.versionCode;
        String versionName = packageInfo.versionName;
        long firstInstallTime = packageInfo.firstInstallTime;
        long lastUpdateTime = packageInfo.lastUpdateTime;
        textView.setText("appName:"+app_name+"\n"+"packageName:"+packageName+"\n " +
                        "versionCode:"+versionCode+"\n versionName:"+versionName+"\n firstInstallTime:"+
                date(firstInstallTime)+"\n lastUpdateTime:"+date(lastUpdateTime));

    private String date(long time){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(time);
        return sdf.format(date);
    }

通过 PackageManager 获得你想要的 App 信息

ApplicationInfo

ApplicationInfo 相对于 PackageInfo 用的会比较少一些。它主要用于获取 Apk 定义在 AndroidManifest.xml 中的一些信息。这些信息是从AndroidManifest.xml的<application>标签获取的,ApplicationInfo对象里保存的信息都是<application>标签里的属性值

这里介绍几个比价常用的:

  • packageName:包名
  • targetSdkVersion:目标 SDK 版本
  • minSdkVersion:最小支持 SDK 版本,有 Api 限制,最低在 Api Level 24 及以上支持
  • sourceDir:App 的 Apk 源文件存放的目录
  • dataDir:data 目录的全路径
  • metaData:Manifest 中定义的 meta 标签数据
  • uid:当前 App 分配的 uid

获取ApplicationInfo

我们可以获取手机上安装的所有程序对应的 ApplicationInfo,也可以获得指定包名的ApplicationInfo,代码如下:

/**
*获取手机上安装的所有的程序对应的 ApplicationInfo
* 它是通过解析AndroidManifest.xml的< application>标签中得到的,所以它能得到所有的app
*/
List<ApplicationInfo> list = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

/**
*获取指定包名的 ApplicationInfo
*/
ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo("com.xx.xx", 0);

通过ApplicationInfo来获取应用程序的基本信息

//获取应用图标
Drawable drawable = applicationInfo.loadIcon(packageManager);

//获取应用程序的 包名
String appPackageName = applicationInfo.packageName;

//获取应用名
//参数 packageManager  是应用管理者对象 
String appName =applicationInfo.loadLabel(packageManager).toString();
<meta-data
	android:name="app_name"
	android:value="弹窗Demo" />

//<application/>标签下metadata获取
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
Bundle metadata = applicationInfo.metaData;//然后通过改bundle获取相应值
metadata.getString("app_name);

ActivityInfo

ActivityInfo、ServiceInfo、ProviderInfo 这三个是平级的,熟悉的一眼就能看出来,它们就是 Android 定义的四大组件中的几个。各自涵盖了一部分信息。一般在外部获取其他 App 的信息的时候,不会获取到这么细致的数据,如果有,看看这几个类准没错

参考:
通过 PackageManager 获得你想要的 App 信息