我正在使用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)
可能我可以使用不同的查询多次查询,并结合结果?
答案 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时,仍然不能保证查询不会太大。可能有适当的标志来帮助解决这个问题,但我不熟悉您的用例。