74

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

4

9 回答 9

153

隐式 Intent 不直接指定应调用的 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()方法检索。

希望这有帮助。

于 2012-11-11T08:44:10.530 回答
29

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

于 2010-05-26T16:41:48.450 回答
23
  1. 显式意图用于调用特定组件。当您知道要启动哪个组件并且不想让用户自由控制要使用的组件时。例如,您有一个具有 2 个活动的应用程序。活动 A 和活动 B。您希望从活动 A 启动活动 B。在这种情况下,您定义了一个针对活动 B 的显式意图,然后使用它直接调用它。

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

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

于 2013-10-07T03:46:40.857 回答
21

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

明确意图:

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

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

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

隐含意图

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

示例:您有一个链接。当您单击该链接时,它应该在某些浏览器中打开该网页。您不确切知道哪个应用程序中的哪个 Activity 可以处理您的请求。您只是模糊地认为它是一个网页链接,因此当有人打开它时它应该在某些浏览器中打开一个网页。在这种情况下,您只需指定 ACTION,然后操作系统会处理其余的事情。

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

奖金:

操作系统如何决定?

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

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

  • 进入 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 及其 Intent-Filters 列表
更多关于 Intent 过滤器和 Intent 解析

于 2017-12-22T08:59:01.347 回答
13

1) Explicit Intent:组件名称开发者知道,名称在 Intent 中指定。

2)隐式意图:未指定意图中的组件。

于 2014-04-23T06:17:36.823 回答
5

文档

有两种类型的意图:

  • 显式意图指定组件以名称(完全限定的类名)开头。您通常会使用显式意图在您自己的应用程序中启动组件,因为您知道要启动的活动或服务的类名。例如,您可以启动一个新活动以响应用户操作或启动服务以在后台下载文件。
  • 隐式意图不命名特定组件,而是声明要执行的一般操作,这允许来自另一个应用程序的组件处理它。例如,如果您想向用户显示地图上的位置,您可以使用隐式意图来请求另一个有能力的应用程序在地图上显示指定位置。
于 2017-05-23T06:03:58.163 回答
2
  1. 隐式意图 - 当我们想通过意图调用系统组件来执行特定任务并且我们并不真正知道要使用的组件的名称时,android 系统将显示所需的应用程序列表来执行任务。
  2. 显式意图 - 当我们想使用活动的完整限定名称调用另一个活动时,当然我们知道活动的名称。
于 2016-10-13T13:10:39.933 回答
2

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

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

例如:考虑一个应用程序,它的登录页面包含两个字段(比如用户名和密码)。如果两者都为真,它将引导我们进入一个显示我们之前输入的用户名字段的页面。在这种情况下,我们使用显式意图,因为我们需要更改活动并将数据从一个活动传送到同一应用程序中的另一个活动(用户名字段)。

隐式意图:它们用于跨两个不同应用程序的通信。

例如:考虑一个使用来自相机的用户图像作为个人资料图片的应用程序。为此,它使用隐式意图。它将调用相机应用程序的意图以从中获取图片。

我希望你能够明白。

于 2018-10-21T11:22:05.280 回答
1

隐含意图

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

明确意图

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