queryIntentActivities() 和 resolveActivity() 之间有什么区别。哪一个是了解现有应用程序的最佳方法?

What is the difference between queryIntentActivities() and resolveActivity().Which one is the best approach to know about existing apps for a intent?

正如我在 Android 文档中看到的那样,在将用户发送到另一个应用程序时尝试构建隐式意图。这是避免 ActivityNotFoundException 的两种方法。

第一个:

Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
    PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

第二个:

Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {

}

现在我的疑问是有什么区别,我应该使用哪一个?

来自文档

检索可以针对给定意图执行的所有活动。

确定针对给定 Intent 执行的最佳操作。 如果未明确指定 class,这就是 Intent.resolveActivity(PackageManager) 查找 activity 的方式。

注意:如果使用隐式Intent(未指定显式ComponentName),请务必考虑是否设置MATCH_DEFAULT_ONLY only 标志。您需要像 Context.startActivity(Intent)Intent.resolveActivity(PackageManager) 那样解析 activity。

简而言之,queryIntentActivities returns 所有可用 ResolveInfo 中的一个 List 可以处理您给定的 Intent 而相反 resolveActivity returns单曲最适合ResolveInfo.

因此,一个可用于显示选择器,另一个可用于直接启动应用程序。

有关更多信息,请阅读他们的官方文档。

取决于你想做什么。

如果您只是想阻止 'ActivityNotFoundException',这两种方法都可以。 "best" 也不是。他们基本上做同样的事情。您想知道是否至少有 1 个 Activity 可以处理您的 Intent.

否则:

  • queryIntentActivities() returns 可以处理 Intent 的所有活动的列表。
  • resolveActivity()returns"best"Activity可以处理Intent

因此,如果您想知道可以处理您的 Intent 的所有活动,您可以使用 queryIntentActivities(),如果您想知道 Android 认为什么是 "best" Activity,那么你会使用 resolveActivity().