android中的显式和隐式活动调用有什么不同?

时间:2012-04-22 22:32:04

标签: android android-activity android-implicit-intent explicit-intent

android中显式和隐式活动调用有什么区别?如果用简单的例子解释答案就会很好。

7 个答案:

答案 0 :(得分:52)

例如:

隐式活动电话

在意图过滤器中,您可以为您的活动创建操作,以便其他应用可以通过此操作调用您的活动,如下所示:

<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 intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

明确的活动电话

您拨打电话,准确指出哪个活动类:

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

希望这有助于您更多地了解Android中的显式和隐式活动调用。

您可以获得有关Android Intent here

的更多详细信息

答案 1 :(得分:26)

  1. 显式意图用于调用特定组件。当您知道要启动哪个组件并且不希望让用户可以自由控制要使用的组件时。例如,您有一个具有2个活动的应用程序。活动A和活动B.您想要从活动A启动活动B.在这种情况下,您可以定义一个明确的意图定位活动B,然后使用它直接调用它。
  2. 当您知道自己想要做什么时会使用隐式意图,但您不知道应该启动哪个组件。或者,如果您希望为用户提供在要使用的组件列表之间进行选择的选项。如果将这些Intent发送到Android系统,它将搜索为特定操作和数据类型注册的所有组件。如果只找到一个组件,Android将直接启动该组件。例如,您有一个使用相机拍照的应用程序。您的应用程序的一个功能是,您可以让用户发送他拍摄的照片。您不知道用户可以发送照片的应用程序类型,并且您还希望为用户提供选项,以便在有多个外部应用程序时选择使用该应用程序。在这种情况下,您不会使用明确的意图。相反,你应该使用一个隐含的意图,其动作设置为ACTION_SEND,其数据额外设置为照片的URI。
  3. 无论它包含什么,明确的意图总是传递给它的目标;不咨询过滤器。但只有当组件可以通过组件的一个过滤器

    时,才会将隐式意图传递给组件

答案 2 :(得分:2)

请参阅此处的意图解决方案

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

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

答案 3 :(得分:1)

有两种类型的意图:

  • 明确的意图:

    我们直接在intent 中明确指定并传递目标组件名称时创建Intent对象时,这是一个明确的意图。

  • 隐含意图:

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

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

答案 4 :(得分:1)

何时使用?

明确意图:当您知道哪个组件可以处理您的请求时。所以你在intent中明确提到了组件名称

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

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

示例:播放音乐

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

OS如何决定?

当存在带有intent的隐式调用时,OS会取出操作,然后它使用PackageManager与所有应用程序的所有已注册活动的所有intent-filters匹配,然后将结果填充为列表。它被称为this
因此,您的设备中可能没有可以处理您请求的应用程序。在这种情况下,您将获得NullPointer异常。

  

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

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

答案 5 :(得分:0)

每次在任何一次采访中我都会对这些感到困惑。因此,我将其总结为这样,可能有助于有人牢记这种差异。

摘要:

Implicit 意图中,用户隐式告诉系统应该做什么,而没有指定应该做什么。

明确意图中,用户明确地告诉系统 WHOM 不管工作是什么。

答案 6 :(得分: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);