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

Android queryIntentActivities()和resolveActivity()之间有什么区别。哪种方法是了解现有应用程序的最佳方法?,android,android-intent,android-activity,android-implicit-intent,Android,Android Intent,Android Activity,Android Implicit Intent,正如我在Android文档中看到的,当试图在将用户发送到另一个应用程序时构建隐式意图。这是避免ActivityNotFoundException的两种方法 第一个: Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); PackageManager packageManager = getPackageManager(); List<ResolveInfo> activities = packageManager.

正如我在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.resolveActivity(PackageManager)
在未明确指定类的情况下查找活动的方式


<强>注:如果使用隐式意图(没有指定明确的组件名),请务必考虑是否设置<代码> MatCHY-DeFultTyAuth/<代码>仅标志。您需要以与

Context.startActivity(Intent)
Intent.resolveActivity(PackageManager)
相同的方式解析活动

简而言之,
queryIntentActivities
返回所有可用
ResolveInfo
列表,该列表可以处理给定的
意图
,而
ResolveInfo
则返回最适合的
ResolveInfo

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


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

取决于你想做什么

如果您只想阻止“ActivityNotFoundException”,则两种方法都可以。两者都不是“最好的”。他们做的基本相同。您想知道是否至少有1个
活动
可以处理您的
意图

否则:

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

因此,如果您想知道所有能够处理您的
意图的活动,您可以使用
querytentActivities()
,如果您想知道Android认为什么是“最好的”
活动,那么您可以使用
resolveActivity()

当我们创建隐式意图时,我们应该使用哪一个?仍然没有解释哪一个最适合创建隐式意图。如果这可以用来显示选择器,那么意图是什么。createChooser(意图,标题);do?@AjayChauhan当您直接使用
createChooser()
时,您可以控制一些行为(即:为选择器设置“标题”)。当Android自己创建选择器时(因为它需要用户选择一些东西来完成
resolveActivity()
),它使用默认选择器。
Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {

}