11

正如我在 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) {

}

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

4

3 回答 3

22

取决于你想做什么。

如果您只想阻止“ActivityNotFoundException”,则任何一种方法都可以。两者都不是“最好的”。他们基本上做同样的事情。您想知道是否至少有 1 个Activity可以处理您的Intent.

否则:

  • queryIntentActivities()返回可以处理的所有活动的列表Intent
  • resolveActivity()返回Activity可以处理的“最佳”Intent

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

于 2018-10-10T12:32:13.977 回答
4

来自文档

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

确定对给定 Intent 执行的最佳操作。Intent.resolveActivity(PackageManager)如果没有明确指定一个类,这就是如何找到一个活动。

注意:如果使用隐式 Intent(未指定显式 ComponentName),请务必考虑是否设置MATCH_DEFAULT_ONLY唯一标志。您需要这样做才能以与Context.startActivity(Intent)执行相同的方式解决活动Intent.resolveActivity(PackageManager)

于 2018-10-10T07:37:02.757 回答
2

简而言之,queryIntentActivities返回一个可以处理您给定List的所有可用的,相反返回一个最适合的。ResolveInfoIntentresolveActivityResolveInfo

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

欲了解更多信息,请阅读他们的官方文档。

于 2018-10-10T07:42:34.997 回答