0
点赞
收藏
分享

微信扫一扫

通过PackageManager、PackageInfo、ApplicationInfo、ActivityInfo获得你想要的 App 信息


文章目录

  • ​​PackageManager​​
  • ​​介绍​​
  • ​​获取​​
  • ​​PackageInfo​​
  • ​​ApplicationInfo​​
  • ​​获取ApplicationInfo​​
  • ​​通过ApplicationInfo来获取应用程序的基本信息​​
  • ​​ActivityInfo​​

PackageManager

介绍

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

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

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

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

获取

在 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、PackageInfo、ApplicationInfo、ActivityInfo获得你想要的 App 信息_android_02

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();

//当我们想在程序debug时打印log,反则不打印log的时候 就需要获取这个debug属性了,可用如下方法获取是否为debug模式
boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
<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 信息​​

举报

相关推荐

0 条评论