与Android合作,我意识到,由于其灵活性,在大多数情况下,隐性意图是不错的选择。但是明确的意图是什么?使用它们有什么好处?当使用它们是一个好习惯时,什么是常见的情况?

有帮助吗?

解决方案

隐式意图不能直接指定应称为的android组件,而仅指定要执行的操作。可以将URI与隐式意图一起使用,以指定数据类型。

例如

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

这将导致Web浏览器打开网页。 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)隐式意图:未指定意图中的组件。

关键:当您知道和不知道时

明确的意图:

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

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

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

隐含意图:

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

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

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

奖金:

操作系统如何决定?

有一个术语。这就是意图解决。
意图解决。

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

  • 进入PackageManager,并查找所有注册活动,并与设备中安装的所有应用程序进行匹配操作。

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

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

有时,可能不会有与动作相匹配的活动。在这种情况下,您将获得一个NullPoInterException。因此,更首选的方法是

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

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

假设您已经编写了一些浏览器应用程序。如果您希望您的应用程序在某人打开链接时出现在弹出列表中。然后,您必须使用意图过滤器AndroidManifest.xml文件注册活动。像这样。

<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>

参考
常见的意图行动及其意图滤清器清单
有关意图过滤和意图解决的更多信息

文档:

有两种类型的意图:

  • 明确的意图 指定要按名称开始的组件(完全合格的类名称)。通常,您通常会使用明确的意图来启动自己的应用程序中的组件,因为您知道要启动的活动或服务的类名。例如,您可以根据用户操作启动新活动,也可以启动在后台下载文件的服务。
  • 隐性意图 请勿命名特定组件,而是声明执行的一般操作,该操作允许另一个应用程序中的组件处理。例如,如果要向用户显示地图上的位置,则可以使用隐式意图来请求另一个功能的应用程序在地图上显示指定位置。
  1. 隐式意图 - 当我们想通过执行特定任务的意图调用系统组件,并且我们真的不知道要使用的组件的名称时,Android系统将显示所需的应用程序列表以执行该任务。
  2. 明确的意图 - 当我们想用活动的完整名称调用另一个活动时,当然我们知道活动的名称。

简而言之,我们可以描述这样的两个意图。

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

例如:考虑一个具有由两个字段组成的登录页面的应用程序(例如用户名和密码)。如果两者都是正确的,它将导致我们进入一个页面,该页面显示我们以前输入的用户名字段。在这种情况下,我们使用明确的意图,因为我们需要在同一应用程序中更改活动并将数据从一个活动(用户名字段)运送到另一个活动(用户名字段)。

隐性意图: 它们用于在不同应用的两个活动之间进行通信。

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

我希望你能够明白。

隐含意图

  • 它可以提起新的应用程序,而没有指定要拉出哪一个。
  • 它仅指定要执行的操作,并且不直接指定Android组件。
  • URI可以具有隐式意图来指定数据类型。

明确的意图

  • 它将拉出特定的应用程序,并在编写代码时设置。
  • 它用于应用程序本身,其中一个活动可以切换到其他活动。
  • 用于使用额外的方法将数据传递给其他活动,并由目标活动getIntent()检索。
  • 它总是将其传递给目标,甚至没有咨询过滤器。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top