Android隐含意图VS显式意图

时间:2010-05-26 16:26:13

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

使用android我意识到隐含意图在大多数情况下都是不错的选择,因为它们具有灵活性。但是什么是显性意图呢? 使用它们有什么好处?使用它们的好习惯是什么常见情况?

9 个答案:

答案 0 :(得分:113)

Implicit Intents不直接指定应该调用的Android组件,它只指定要执行的操作。 Uri可以与隐含意图一起使用以指定数据类型。

例如

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

这将导致网络浏览器打开网页。 Android系统搜索为特定操作和数据类型注册的所有组件。如果找到许多组件,则用户可以选择要使用的组件..

在应用程序本身中使用显式意图,其中一个活动可以切换到其他活动...示例Intent intent = new Intent(this,Target.class);这会导致活动从当前上下文切换到目标活动。 显式意图也可用于使用putExtra方法将数据传递到其他活动,并通过getIntent().getExtras()方法按目标活动检索。

希望这会有所帮助。

答案 1 :(得分:24)

您通常使用显式意图来启动您自己的应用程序中的活动。那时你确切地知道你想要开始哪个活动,所以没有理由去完成设置隐含意图的额外工作。

答案 2 :(得分:20)

  1. Explicit Intents用于调用特定组件。当您知道要启动哪个组件并且不希望让用户可以自由控制要使用的组件时。例如,您有一个具有2个活动的应用程序。活动A和活动B.您想要从活动A启动活动B.在这种情况下,您定义一个显式的意图目标activityB,然后使用它直接调用它。

  2. 当您知道自己想要做什么时,会使用隐式意图,但您不知道应该启动哪个组件。或者,如果您希望为用户提供在要使用的组件列表之间进行选择的选项。如果将这些Intent发送到Android系统,它将搜索为特定操作和数据类型注册的所有组件。如果只找到一个组件,Android将直接启动该组件。例如,您有一个使用相机拍照的应用程序。您的应用程序的一个功能是,您可以让用户发送他拍摄的照片。您不知道用户可以发送照片的应用程序类型,并且您还希望为用户提供选项,以便在有多个外部应用程序时选择使用该应用程序。在这种情况下,您不会使用明确的意图。相反,你应该使用一个隐含的意图,其动作设置为ACTION_SEND,其数据额外设置为照片的URI。

    无论它包含什么,明确的意图总是传递给它的目标;不咨询过滤器。但只有当组件可以通过组件的一个过滤器时,才会将隐式意图传递给组件

答案 3 :(得分:12)

1)显式意图:组件名称开发人员知道,在Intent中指定名称。

2)隐含意图:未在意图中指定组件。

答案 4 :(得分:6)

KEY:当你知道和不知道的时候

  

明确的意图:

当您确切知道哪个Activity可以处理您的请求时,请使用显式意图。

示例:您有一个列表活动,当您单击列表中的项目时,它会打开一个详细信息活动。在这种情况下,您知道项目的详细信息可以由您的应用程序的DetailActivity.class显示或处理。 因此,要执行此操作,您可以通过显式指定类名来创建Intent。

Intent showDeatil = new Intent(this,DetaiActivy.class);  
startActivity(showDeatil);
  

隐含意图

当您不知道哪个应用程序的哪个活动可以处理您的请求时,请使用隐式意图。

示例:您有一个链接。当您单击该链接时,它应该在某些浏览器中打开该网页。您不知道确切地说明哪个应用程序可以处理您的请求。你只是有一个模糊的想法,它的网页链接,所以当有人打开它时,它应该在某个浏览器中打开一个网页。在这种情况下,您只需指定ACTION,然后OS负责其余部分。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

奖金:

OS如何决定?

有一个术语。它被称为意图解析 在意图解析。

  • 操作系统会取出你意图中指定的动作。

  • 进入PackageManager并查找所有已注册的内容 与您的设备中安装的所有应用程序匹配的ACTION活动。

  • 在弹出窗口中显示所有匹配应用程序的列表。

写隐式意图的更安全的方法。

有时可能没有与ACTION匹配的Activity。在这种情况下,您将获得NullPointerException。所以更优选的方式是

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

如何让您的应用程序进入该弹出列表?

假设您已经编写了一些浏览器应用程序。如果您希望在有人打开链接时您的应用程序显示在弹出列表中。然后,您必须使用Intent Filters AndroidManifest.xml文件注册您的Activity。像这样。

<application
    .....  >

    ......
    <activity android:name=".YourBrowserActivity">
        <action android:name="android.intent.action.VIEW" />       
        <data android:scheme="http" android:host="www.example.com" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    </activity>
 ..... 


</application>

<强>参考
Common Intent ACTIONS and their Intent-Filters list
More on Intent filters and Intent resolution

答案 5 :(得分:3)

来自Docs

有两种类型的意图:

  • 显式意图指定按名称开头的组件(完全限定的类名)。您通常会使用显式意图在您自己的应用中启动组件,因为您知道要启动的活动或服务的类名。例如,您可以启动新活动以响应用户操作或启动服务以在后台下载文件。
  • 隐式意图不会命名特定组件,而是声明要执行的常规操作,这允许来自其他应用的组件处理它。例如,如果要向用户显示地图上的位置,则可以使用隐式意图请求另一个有能力的应用在地图上显示指定位置。

答案 6 :(得分:1)

  1. 隐含意图 - 当我们想要通过意图调用系统组件来执行特定任务而我们并不真正知道要使用的组件的名称时,android系统将显示所需的应用程序列表以执行任务。
  2. 显式意图 - 当我们想要使用活动的完全限定名称调用另一个活动时,我们当然知道活动的名称。

答案 7 :(得分:1)

我们可以像这样描述两个意图。

明确意图::它们用于在单个应用程序中的两个活动之间进行通信。

例如:考虑一个应用程序,它有一个由两个字段组成的登录页面(例如用户名和密码),如果两个都为真,它将导致我们进入一个显示我们之前输入的用户名字段的页面。明确的意图,因为我们需要在同一应用程序中更改活动并将数据从一个活动携带到另一个活动(用户名字段)。

隐含意图::它们用于不同应用程序的两个活动之间的通信。

例如:考虑一个描述事故的新闻应用程序,其中事故视频被记录并上传到Facebook。在新闻应用程序中单击链接时,它将引导我们到Facebook。在这种情况下,通讯是在新闻应用程序中的活动与Facebook应用程序中的活动之间进行的。为此,我们使用隐式意图。

希望您能理解。

答案 8 :(得分:0)

隐含意图

  • 它拉起新的应用程序,而没有指定要拉哪个应用程序。
  • 它仅指定要执行的操作,而不直接指定Android组件。
  • URI可以与隐式Intent一起使用以指定数据类型。

明确意图

  • 它将拉出特定的应用程序,并在编写代码时进行设置。
  • 它用于应用程序本身,其中一个活动可以切换到其他活动。
  • 用于使用put extra方法将数据传递到其他活动,并由目标活动getIntent()检索。
  • 即使未咨询过滤器,它始终会传递给目标。