执行queryIntentActivities

时间:2018-02-08 17:48:02

标签: java android

我正在使用Android 5.0.1的设备并执行以下功能:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent,0);

抛出类型TransactionTooLargeException的异常.... 我不能使用标志:MATCH_DEFAULT_ONLY因为我不能仅限于那些支持CATEGORY_DEFAULT的活动。 看起来问题与返回的数据量有关,就像我在stackoverflow找到的许多相关问题一样...... 有没有办法打破这种反应?或者是否有一个查询,等价物或标志组合,可以获得相同的结果,从而产生多个查询? 我问,因为我不清楚文档中flag = 0的含义:https://developer.android.com/reference/android/content/pm/PackageManager.html#queryIntentActivities(android.content.Intent,int)

可能我可以使用不同的查询多次查询,并结合结果?

1 个答案:

答案 0 :(得分:0)

您可以通过更具体地了解您构建Intent的方式来查询查询,并进行多次查询而不是一次性查询。现在,你基本上都在查询设备上的每个应用程序(每个应用程序可能有多个)(因为所有可以启动的应用程序都有android.app.action.Main操作),这会超过你对~1 MB共享缓冲区的分配导致异常的parcel limit

来自文档:

{ action=android.app.action.MAIN } matches all of the activities that can be used as top-level entry points into an application.

{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER } is the actual intent used by the Launcher to populate its top-level list.

因此,添加类别会缩小搜索结果的范围。如果您需要操作类型“android.app.action.Main”,请将其用作操作,然后迭代另一组categories ex sudo代码:

List<ResolveInfo> activities = new ArrayList<ResolveInfo>()

String[] categories = new String[] { android.app.category.LAUNCHER, additional... }

for(String category: categories){
   Intent mainIntent = new Intent(Intent.ACTION_MAIN)
   mainIntent.addCategory(category)
   List<ResolveInfo> matches = manager.queryIntentActivities(mainIntent, 0);  //You might want to use a better @ResolveInfoFlag to narrow your ResolveInfo data
   if(!matches.isEmpty()){
      activities.addAll(matches)
   }
}

你也应该尝试一下try,因为在做MATCH_ALL时,仍然不能保证查询不会太大。可能有适当的标志来帮助解决这个问题,但我不熟悉您的用例。