Android教程:Android Intent(意图)

时间:2020-02-23 14:28:42  来源:igfitidea点击:

本Android教程涵盖了下一个构建块的基础知识,例如:Android Intent。

1.Android教程:Intent

在涵盖新面试问题的Android教程中,我们通过以下示例解释了Intent在Facebook中的用法:

假设我们在新闻提要屏幕上(这是一个活动),并且想要查看我们朋友发布的图片。
当我们单击照片时,与照片的单击事件关联的意图被激发并传达消息,并且"照片"页面打开(这是一个新的活动)。

因此,我们假设我们对Android Intent有所了解。
本Android教程将讨论与该主题相关的一些更深层次的概念。

  • 将意图视为传达行动的信息。它是我们要完成的操作的描述,例如:观看视频,玩游戏等。

  • 它们是被调用时将充当Android三个核心组件之间的通信器的命令,例如:活动,服务和广播接收器。

  • 当我们与一个活动进行交互时,我们可能希望切换到另一个活动。这是通过为操作定义适当的Intent来完成的。其中一个活动使用Intent请求启动另一个活动。因此,很明显,使用意图,一个Android组件可以向Android的其他组件请求操作。

为了简化这一点,让我们再次以Facebook应用程序为例。

下面的示例假定我们正在"照相馆活动"中,并且想要查看特定的照片(该照片将在其自己的活动中打开)。
这是触发与点击照片事件关联的Intent的方式:

有时,可以定义一个Intent来通知Android系统事件的发生。
这恰好是在广播接收器的情况下发生的情况(例如,定义了意图来向用户传达电池电量不足通知)。

让我们再举一个Domino的Pizza应用程序的例子。
让我们假设我们正在查看应用程序的菜单屏幕(活动),并且想要选择披萨。
当我们选择墨西哥波比萨饼,然后单击"自定义"按钮时,会弹出另一个屏幕(活动),我们可以其中进一步指定比萨饼的大小,所需的硬皮类型等。
其中单击操作(选择比萨饼意向)菜单上的消息传达了打开新弹出窗口(新活动)的消息。

简单的;正确的!让我们在Android教程的下一部分中详细了解一下:

2.Intent对象

如果我们希望与朋友约会,并通过信使传达信息,则应提供信使详细信息,例如朋友的姓名和所需会议的详细信息(时间,地点等)。
没有将会议的具体情况告知信使,我们不能仅仅假设他们会弄清楚该怎么做。
我们可以将所有这些信息写在纸上,以供信使参考。

同样,由于意图是消息,它要传达的完整信息必须存储在某个地方,对!意图对象负责这一点。

2.1 Intent Object包含哪些信息?

意图对象包含"意图"旨在传达的所有信息:

  • 接收Intent的组件所需的所有信息(例如,接收Intent时要执行的操作)。 (在上面的示例中,这将是朋友所知道的信息,例如会议的地点,会议的时间等)

  • Android系统所需的信息(例如,Intent所针对的Component类别的描述)包含在Intent Object中。 (在上面的示例中,信使本身所需的信息将构成其中的一部分,例如朋友的姓名,他的地址等)

以下信息构成意图对象的一部分:

  • 组件名称:此信息是可选的。如果设置了组件名称,则Android系统会将意图直接映射到目标组件。在其他情况下,系统利用其他信息来定位合适的目标。组件名称由setComponent(),setClass()或者setClassName()设置,并由getComponent()读取。

  • 动作:此信息指定Android组件在收到Intent时应采取的动作,或者已经发生的动作,并已通知系统。 Android系统定义了许多动作常量。我们在此Android教程中列出了两个:

  • 数据:包含数据的统一资源标识符(URI)。对于不同的操作,有不同类型的数据规范。例如,如果定义的动作是ACTION_CALL,则数据字段将包含要调用的号码(电话:URI)。为了使Intent与合适的组件正确匹配,定义数据类型(除了URI)会有所帮助。例如,用于显示图像的组件应被调用为仅显示图像,而不是播放音频文件。

  • 类别:这定义将处理Intent的组件的类别。

  • 其他:这是需要传递给处理意图的组件的其他信息。

  • 标志:许多标志可以成为Intent Object中包含的信息的一部分。例如,标志可以指示Android系统以特定方式启动活动(我们可以指定在浏览器的新窗口中启动新活动。)

3.意向类型

进一步讲,意图可以是显式的也可以是隐式的。

3.1明确意图:

明确意图实际上就是它的字面意思:执行动作的"明确意图"。
简而言之,在这种情况下,我们明确定义了需要调用的Android组件(活动,服务或者广播接收器)。

示例代码1:显式意图示例代码

3.2隐式意图

其中我们没有专门定义需要调用的组件。
但是,该Intent包含足够的信息以指导系统获取正确的信息。

示例代码2:隐式意图示例代码

上面的隐式意图告诉Android系统查看URI中提供的网页。

4.意图解决

由于隐式意图的任意性质,系统使用称为"意图解析"的过程来正确映射它们。
系统通过将Intent描述与系统中的默认描述进行匹配来实现此目的。

先前定义的意图对象在这里起作用。
意图解析将意图对象的内容与意图过滤器进行比较。
(Intent过滤器与不同的Android组件相关联,并且可以接收Intent。
Intent过滤器是Android组件向Android系统声明其功能的一种方式。
)

过滤器在定义Android组件可以接收的意图类型方面起着重要作用。
没有过滤器的组件只能接收显式意图,而没有过滤器的组件则可以接收显式意图和隐式意图。
Intent Resolution使用以下信息将Intent映射到适当的Android组件:

  • 那个行动

  • 类型(数据类型和URI)

  • 类别

可以看出,添加功能和标志在这里没有作用。