简单来说
这些类指向应用程序的同一源AndroidManifest.xml。区别在于访问级别,没有其他区别。有时您需要所有信息,但大多数情况下,您只需要处理特定信息。在这些情况下,无需解析清单文件的所有内容。
PackageInfo
可以访问清单的所有内容。如果您想阅读清单的每个细节,则可以使用此选项。
ApplicationInfo
可以访问清单文件的Application标记,因此忽略了文件的所有不相关区域。
ResolveInfo可以访问intent-filters,从而忽略所有其他详细信息。
ApplicationInfo和ResolveInfo只是我们可以根据需求使用的方便类。
从文档和一些关于如何使用它们的示例中:
ApplicationInfo文档:
您可以检索有关特定应用程序的信息。这对应于从AndroidManifest.xml的tag收集的信息。
示例:
使用
ApplicationInfo.FLAG_SYSTEM
标记来过滤系统应用程序。
if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1)
{
// system app
}
PackageInfo 文档:
关于应用程序包内容的总体信息。这对应于从 AndroidManifest.xml 收集的所有信息。
示例:获取应用程序的 versionCode
long versionCode = 0L;
if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
versionCode = packageManager.getPackageInfo(packageName, 0).getLongVersionCode();
} else {
versionCode = (Long) packageManager.getPackageInfo(packageName, 0).getVersionCode();
}
ResolveInfo文档:
从意图过滤器解析意图后返回的信息。这部分对应于从AndroidManifest.xml的标签中收集的信息。
示例:
final Intent newIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( newIntent, 0);
for (ResolveInfo rInfo : list) {
System.out.println("Installed Applications supporting category launcher " + rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
}
上述示例将帮助您获取
ResolveInfo
以启动应用程序。
PackageManager pm = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>)
pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED);
for (ResolveInfo rInfo : list) {
System.out.println("Installed Applications " + rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
}