Android:使用intent-filter搜索已安装的软件包

时间:2014-03-12 14:03:54

标签: android android-intent package intentfilter

我试图列出包含特定intent-filter

的已安装软件包

例如:

Intent-Filter 1

Intent intent1 = new Intent("com.this.is.sample1");

Intent-Filter 2

Intent intent2 = new Intent("com.this.is.sample2");
intent2.addCategory("com.this.is.sample2.category");

Intent-Filter 3

Intent intent3 = new Intent("com.this.is.sample3");
intent3.addCategory("com.this.is.sample3.category");

我的问题

如何在1个列表中列出所有这些内容而没有重复?

目前我使用此代码但会导致重复

List<ResolveInfo> listone, listtwo, listthree, listfinal;
listone = getPackageManager().queryIntentActivities(intent1, PackageManager.GET_RESOLVED_FILTER);

listtwo = getPackageManager().queryIntentActivities(intent2, PackageManager.GET_RESOLVED_FILTER);

listthree = getPackageManager().queryIntentActivities(intent3, PackageManager.GET_RESOLVED_FILTER);

//Adding all of them into 1 List<ResolveInfo>
listfinal.addAll(listone);
listfinal.addAll(listtwo);
listfinal.addAll(listthree);

新代码,仍然包含重复

Set<ResolveInfo> newlist = new HashSet<ResolveInfo>();
List<ResolveInfo> listone, listtwo, listthree, listfinal;

listone = getPackageManager().queryIntentActivities(intent1, PackageManager.GET_RESOLVED_FILTER);

listtwo = getPackageManager().queryIntentActivities(intent2, PackageManager.GET_RESOLVED_FILTER);

listthree = getPackageManager().queryIntentActivities(intent3, PackageManager.GET_RESOLVED_FILTER);

if (listone!=null) {
    for (int i = 0; i < listone.size(); i++) {
        newlist.add(listone.get(i));
    }

    if (listtwo!=null) {
        for (int j = 0; j < listtwo.size(); j++) {
            newlist.add(listtwo.get(j));
        }

        if (listthree!=null) {
            for (int k = 0; k < listthree.size(); k++) {
                newlist.add(listthree.get(k));
            }

            if (newlist!=null) {
                listfinal.addAll(newlist);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

什么算作副本?

您当前的3个列表是ResolveInfo,并且您特别要求填写此过滤器字段。因此您可能会在每个列表中找回相同的包,但使用不同的过滤器导致匹配。< / p>

假设您只需要一个没有重复项的软件包名称列表,您将需要自己进行重复数据删除 - 填充一组软件包名称可能是实现此目的的最佳方法。