Android 隐式意图 VS 显式意图

使用 android 时,我意识到隐式意图在大多数情况下都是很好的选择,因为它们具有灵活性。但是明确的意图呢? 使用它们的好处是什么? 当使用它们是一个很好的实践时,常见的情况是什么?

98014 次浏览

您通常在自己的应用程序中使用显式意图来启动活动。在这一点上,您确切地知道您想要启动哪个活动,因此没有理由进行设置隐式意图的额外工作。

隐式意图不直接指定应该调用的 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. 显式意图用于调用特定组件。当您知道要启动哪个组件并且不想让用户自由控制要使用哪个组件时。例如,您有一个具有2个活动的应用程序。活动 A 和活动 B。你想从活动 A 开始启动活动 B。在本例中,您定义了一个显式的目标活动 B 的意图,然后使用它直接调用它。

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

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

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

2)隐式意图: 意图中没有指定组件。

  1. Implicit intent - When we want to call the system components through intent to perform a particular task and we don't really know the name of the components to be used, the android system will show the desired list of applications to perform the task.
  2. 显式意图-当我们想用活动的完整限定名称调用另一个活动时,当然我们知道活动的名称。

来自 医生:

有两种意图:

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

关键: 当你知道,当你不知道

明确的意图:

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

示例: 您有一个列表活动,当您单击列表中的一个项目时,它会打开一个详细信息活动。在这种情况下,您的 知道,该项目的细节可以显示或处理的 DetailActivity.class的应用程序。 So to perform this action you create an Intent by explicitly specifying the class name.

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

内隐意图 :

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

你有一个链接。当你点击这个链接时,它应该会在某个浏览器中打开这个网页。应用程序可以处理您的请求的确切活动是 不知道。你只是有一个模糊的想法,这是一个网页链接,所以它应该打开一个网页在某些浏览器,当有人打开它。在这种情况下,您只需指定 ACTION,然后由 OS 来处理其余的事情。

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

BONUS:

操作系统如何决定?

有一个专门的术语,叫做意图解决。
意图解决。

  • 操作系统取出在您的意图中指定的 ACTION。

  • 进入 PackageManager 并查找所有注册的 所有安装在您的设备中的应用程序都可以使用匹配的 ACTION 进行活动。

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

A safer way to write implicit intents.

有时可能没有与 ACTION 匹配的 Activity。在这种情况下,您将得到一个 NullPointerException。所以更好的办法是这样

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

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

假设您已经编写了一些浏览器应用程序。当有人打开链接时,如果您希望您的应用程序显示在弹出列表中。然后,必须使用意图过滤器 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>

参考文献
公共意图操作及其意图过滤器列表
更多关于意图过滤器和意图解析的资料

简单来说,我们可以这样描述这两种意图..。

显式意图: 它们用于特定应用程序内部的通信。

eg: Consider an application that has a login page consisting of two Fields (say username and password).If both are true it will lead us to a page that displays the username field which we entered before. In this case, we use explicit intents because we need to change the activities and to carry data from one activity to the other activity(username field) in the same application.

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

考虑一个应用程序,使用用户的形象从相机作为一个配置文件图片。为此,它使用了隐式意图。它将调用意图到相机应用程序,以从它获得图片。

我希望你能理解。

Implicit Intent

  • 它将显示新的应用程序,而不指定要显示哪个应用程序。
  • 它只指定要执行的操作,而不直接指定 Android 组件。
  • URI 可以与隐式意图一起使用来指定数据类型。

Explicit Intent

  • 它将拉出一个特定的应用程序,并在编写代码时进行设置。
  • 它用于应用程序本身,其中一个活动可以切换到其他活动。
  • Used to pass data to other activity using put extra method and retrieved by target activity getIntent().
  • 它总是交付给目标,甚至过滤器没有咨询。