通过 PackageManager 获得你想要的 App 信息
文章目录
PackageManager
介绍
有些场景下,我们会需要获取一些其它 App 的各项信息,例如:App 名称,包名、Icon 等。这个时候就需要使用到 PackageManager 这个类了
你首先需要获取 PackageManager(以下简称 PM) 对象,通过 PM 对象,你就可以获取到你需要的各项 App 的信息类
这里涉及到的 App 信息类包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,还有一个 ResolveInfo 类,它比较特殊一点,不和前面的结构为从属关系
这些类,都可以在根据 AndroidManifest.xml 中定义的组件进行划分,大概的结构如下
获取
在 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);
}
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 的信息的时候,不会获取到这么细致的数据,如果有,看看这几个类准没错
上一篇: 小时侯喜欢捡石头乱扔