Android中显式和隐式活动调用有什么区别?

39

在安卓中,显式调用和隐式调用活动之间有什么区别?如果您能通过简单的例子来解释答案会很好。


7个回答

64
例如:
隐式活动调用
在意图过滤器中,您为您的活动创建操作,因此其他应用程序可以通过以下方式通过此操作调用您的活动:
<activity android:name=".BrowserActivitiy" android:label="@string/app_name">
   <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="http"/> 
   </intent-filter>
</activity>

另一种调用隐式意图的方法如下:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

显式活动调用

您可以进行指定活动类的调用:

Intent intent = new Intent(this, ActivityABC.class);
intent.putExtra("Value", "This value for ActivityABC");
startActivity(intent);

希望这可以帮助您更好地了解Android中的显式和隐式活动调用。
您可以在这里获取有关Android Intent的更多详细信息。

31
  1. 显式 Intent 用于调用特定组件。当你知道想要启动哪个组件,且不想让用户自由控制使用哪个组件时使用。例如,你有一个包含两个 Activity 的应用程序,Activity A 和 Activity B。你想从 Activity A 启动 Activity B。在此情况下,你需要定义一个针对 Activity B 的显式 Intent,并直接调用它。
  2. 隐式 Intent 用于在你知道想要做什么时,却不知道应该启动哪个组件;或者如果你想给用户提供在一系列组件中选择的选项。如果这些 Intent 被发送到 Android 系统,那么系统将搜索所有已注册特定操作和数据类型的组件。如果只找到一个组件,则 Android 直接启动该组件。例如,你有一个应用程序,使用相机拍照。你的应用程序的一个功能是,让用户能够发送他拍摄的照片。你不知道用户有哪些可以发送图片的应用程序,也想给用户选择多个外部应用程序的选项。在这种情况下,你不应该使用显式 Intent。相反,你应该使用一个隐式 Intent,将其操作设置为 ACTION_SEND,将数据 extra 设置为照片的 URI。

无论显式 Intent 包含什么内容,都会直接传递到目标组件,过滤器不会被查询。但是,隐式 Intent 只有在能够通过组件的过滤器时才会传递给该组件。


3

每当我在面试中遇到这些问题时,我都会总结一下,希望能帮助大家记住它们的区别。

总结:

隐式意图中,用户隐含地告诉系统应该做什么,而没有指定谁应该执行。

显式意图中,用户明确地告诉系统应该触发谁来执行工作。


2

何时使用哪个?

显式意图:当您知道哪个组件可以处理您的请求时,您可以在意图中明确提及该组件名称

Intent i = new Intent(context,DetailActivity.class);  // DetailActivity.class is the component name
startActivity(i);

隐式意图:当您不知道哪个应用程序可以处理您的请求时,您可以在意图中提及所需的动作,让操作系统决定哪个或哪些应用程序适合您的任务。

例如:播放音乐

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(file);
startActivity(intent);

操作系统如何决定?

当有一个隐式调用时,操作系统会提取动作并将其与所有已注册应用程序的所有活动的意图过滤器进行匹配,使用PackageManager将结果填充为列表。这被称为意图解析
因此,有可能您的设备上没有可以处理您请求的应用程序。在这种情况下,您将收到NullPointer异常。

因此,调用隐式意图的更安全的方法是:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(file);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

2

查看Intent Resolution(意图解析)请点击这里

http://developer.android.com/guide/topics/intents/intents-filters.html

显式Intent(活动)指向特定类,并且通常仅对您的包可用。隐式Intent指向意图过滤器,其中应用程序公开宣布可以处理某些类型的数据或提供特定服务,例如发送电子邮件。使用隐式Intent时,用户选择要使用哪个活动(通常是一个包)来处理意图,或者如果设置了默认处理程序,则会启动它。


1
有两种类型的意图:
  • 显式意图(Explicit Intent):

    在创建Intent对象时,如果我们直接指定并传递目标组件名称,那么它就是显式意图。

  • 隐式意图(Implicit Intent):

    在这种情况下,我们将评估已注册组件的任务委托给Android(通常使用我们稍后将介绍的意图过滤器进行注册),根据我们传递的意图数据和预期操作(例如发送电子邮件,拍摄照片,在地图上固定位置等)。因此,Android将自动启动来自同一应用程序或其他可以处理意图消息/作业的应用程序的组件。在这种情况下的想法是,假设我们必须在地图上标记位置,为此我们不必编写自己的活动来处理它。相反,只需将位置数据传递给像Google Maps这样的应用程序,该应用程序可以代表我们的应用程序完成工作。

来源:http://codetheory.in/android-intents/


0

隐式意图不指定组件。 意图提供了组件的信息

Intent intent=new Intent(Intent.ACTION_VIEW);  
intent.setData(Uri.parse("http://www.google.com"));
startActivity(intent); 

相反地,显式意图指定组件。 意图提供有关类的信息。

 Intent i = new Intent(this, ClassB.class);  
 startActivity(i); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接