ApplicationInfo与PackageInfo vs ResolveInfo

时间:2013-12-10 09:00:43

标签: android android-package-managers

对于手机上安装的所有应用,我需要访问:

  • 名称
  • 图标
  • 可以安装应用的Google Play网址

我查看了ApplicationInfo,但似乎没有向我提供此信息。我听说过PackageInfo和ResolveInfo,但我很困惑它们之间有什么区别,应该在哪里使用?最后,我可以使用什么来查找有关已安装应用程序的上述三个详细信息?

对于包名,我得到的东西就像com.something.some

这是我用来获取应用的代码:

final PackageManager pm = getPackageManager();
ArrayList<ApplicationData> listAppData = new ArrayList<ApplicationData>();

//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    listAppData.add(new ApplicationData(packageInfo));
}

ApplicationData是我自己的类,我从packageInfo

中提取信息

3 个答案:

答案 0 :(得分:1)

  

哪一个应该用在哪里?

这些结构表示不同查询返回的结果。这种结构和这种结构的集合是Java可以为一个函数调用返回多个数据的唯一方法。 因此,当您进行返回查询时,请使用它们。

我建议搜索stackoverflow以获取这些结构的使用示例(也就是说,搜索字符串将是“stackoverflow structure android”)。一个这样的例子: Android launch browser without specifying a URL

还有一个片段:

//Drawable d; Button b;
d = getPackageManager().getApplicationIcon(pkg);
b.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);

还有一个:

 public boolean isPackageInstalled(String targetPackage){
     PackageManager pm=getPackageManager();
     try {
         PackageInfo info=pm.getPackageInfo(targetPackage,PackageManager.GET_META_DATA);
     } catch (NameNotFoundException e) {
         return false;
     }  
     return true;
}

答案 1 :(得分:1)

此功能将返回带有图标,名称和包的应用列表。

使用该软件包,您可以使用以下内容构建网址:

https://play.google.com/store/apps/details?id= <PACKAGE>

请参阅:

public class Application {

    private String packageName;
    private String name;
    private Drawable icon;
    private boolean checked;
...

private List<Application> getAllApplications(Context context)
            throws NameNotFoundException {

        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> packages = packageManager.getInstalledPackages(0);

        List<Application> myPackages = new ArrayList<Application>();

        for (PackageInfo pack : packages) {
            if (pack.versionName == null) {
                continue;
            }

            Application newPack = new Application();
            newPack.setPackageName(pack.packageName);
            newPack.setName(pack.applicationInfo.loadLabel(packageManager)
                    .toString());
            newPack.setIcon(pack.applicationInfo.loadIcon(packageManager));

            myPackages.add(newPack);
        }

        return myPackages;
    }

答案 2 :(得分:1)

简单来说

  

这些类指向Application的相同源AndroidManifest.xml。   区别仅在于访问级别。   有时您需要所有信息,但大多数时候需要   仅处理特定信息。在那种情况下,没有必要   解析清单文件的所有内容。

PackageInfo有权访问清单中的所有内容。如果您想阅读清单的每一个细节,可以使用它

ApplicationInfo有权访问清单文件的应用标签,因此忽略了文件的所有不相关区域。

ResolveInfo可以访问意图过滤器,因此忽略了所有其他详细信息。

ApplicationInfo和ResolveInfo只是我们可以根据需要使用的便捷类。

从文档以及有关如何使用它们的一些示例中:

ApplicationInfo 文档:

  

您可以检索有关特定应用程序的信息。这个   对应于从AndroidManifest.xml收集的信息    标签。

示例:

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 文档:

  

解决针对某项的意图所返回的信息   IntentFilter。这部分对应于从   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());
}