Intent
是一个消息传递对象,您可以使用它从其他应用组件请求操作,基本用例主要包括:启动 Activity,启动服务,传递广播.
Intent 分为显式 Intent和隐式 Intent.显式Intent是按名称(完全限定类名)指定要启动的组件,通常,您会在自己的应用中使用显式 Intent 来启动组件;隐式 Intent不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它.
创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent
对象中指定的应用组件;创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件.
Intent 过滤器是应用清单文件中的一个表达式,它指定该组件要接收的 Intent 类型.通过为 Activity 声明 Intent 过滤器,您可以使其他应用能够直接使用某一特定类型的 Intent 启动 Activity.同样,如果您没有为 Activity 声明任何 Intent 过滤器,则 Activity 只能通过显式 Intent 启动.
注意:为了确保应用的安全性,启动 Service
时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器.
构建 Intent
Intent
中包含的主要信息如下:
组件名称(要启动的组件名称):[可选项] 注:启动 Service
时,您应始终指定组件名称
操作: 指定要执行的通用操作(例如,"查看"或"选取")的字符串
以下是一些用于启动 Activity 的常见操作:
如果您拥有一些某项 Activity 可向用户显示的信息(例如,要使用图库应用查看的照片;或者要使用地图应用查看的地址),请使用 Intent 将此操作与
startActivity()
结合使用.
这也称为“共享”Intent。如果您拥有一些用户可通过其他应用(例如,电子邮件应用或社交共享应用)共享的数据,则应使用 Intent 将此操作与
startActivity()
结合使用.
数据:
引用待操作数据和/或该数据 MIME 类型的 URI(
Uri
对象)。提供的数据类型通常由 Intent 的操作决定.创建 Intent 时,除了指定 URI 以外,指定数据类型(其 MIME 类型)往往也很重要.
要仅设置数据 URI,请调用
setData()
。 要仅设置 MIME 类型,请调用setType()
。如有必要,您可以使用setDataAndType()
同时显式设置二者.
类别:
一个包含应处理 Intent 组件类型的附加信息的字符串.(大多数 Intent 均不需要类别)
常见类别:CATEGORY_BROWSABLE,CATEGORY_LAUNCHER
您可以使用
addCategory()
指定类别.
Extra:
携带完成请求操作所需的附加信息的键值对.
标志:
在
Intent
类中定义的、充当 Intent 元数据的标志.
显式 Intent
显式 Intent 是指用于启动某个特定应用组件(例如,应用中的某个特定 Activity 或服务)的 Intent.
隐式 Intent
隐式 Intent 指定能够在可以执行相应操作的设备上调用任何应用的操作。 如果您的应用无法执行该操作而其他应用可以,且您希望用户选取要使用的应用,则使用隐式 Intent 非常有用.
强制使用应用选择器
如果有多个应用响应隐式 Intent,则用户可以选择要使用的应用,并将其设置为该操作的默认选项。 如果用户可能希望今后一直使用相同的应用执行某项操作(例如,打开网页时,用户往往倾向于仅使用一种网络浏览器),则这一点十分有用.
但是,如果多个应用可以响应 Intent,且用户可能希望每次使用不同的应用,则应采用显式方式显示选择器对话框。 选择器对话框每次都会要求用户选择用于操作的应用(用户无法为该操作选择默认应用)。 例如,当应用使用
ACTION_SEND
操作执行“共享”时,用户根据目前的状况可能需要使用另一不同的应用,因此应当始终使用选择器对话框.
要显示选择器,请使用
createChooser()
创建Intent
,并将其传递给startActivity().
接收隐式 Intent
要公布应用可以接收哪些隐式 Intent,请在清单文件中使用
<intent-filter>
元素为每个应用组件声明一个或多个 Intent 过滤器。每个 Intent 过滤器均根据 Intent 的操作、数据和类别指定自身接受的 Intent 类型。 仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件.应用组件应当为自身可执行的每个独特作业声明单独的过滤器.
每个 Intent 过滤器均由应用清单文件中的
<intent-filter>
元素定义,并嵌套在相应的应用组件.在<intent-filter>
内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent 类型:
在
name
属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量.
使用一个或多个指定数据 URI 各个方面(
scheme
、host
、port
、path
等)和 MIME 类型的属性,声明接受的数据类型.
在
name
属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量.
注:为了接收隐式 Intent,必须将
CATEGORY_DEFAULT
类别包括在 Intent 过滤器中系统通过将 Intent 与所有这三个元素进行比较,根据过滤器测试隐式 Intent。 隐式 Intent 若要传递给组件,必须通过所有这三项测试。如果 Intent 甚至无法匹配其中任何一项测试,则 Android 系统不会将其传递给组件。 但是,由于一个组件可能有多个 Intent 过滤器,因此未能通过某一组件过滤器的 Intent 可能会通过另一过滤器.
使用待定 Intent
PendingIntent
对象是Intent
对象的包装器。PendingIntent
的主要目的是授权外部应用使用包含的Intent
,就像是它从您应用本身的进程中执行的一样.
待定 Intent 的主要用例包括:
声明用户使用您的通知执行操作时所要执行的 Intent(Android 系统的
NotificationManager
执行Intent
);
声明用户使用您的 应用小部件执行操作时要执行的 Intent(主屏幕应用执行
Intent
);
声明未来某一特定时间要执行的 Intent(Android 系统的
AlarmManager
执行Intent
);
由于每个
Intent
对象均设计为由特定类型的应用组件(Activity
、Service
或BroadcastReceiver
)进行处理,因此还必须基于相同的考虑因素创建PendingIntent
。使用待定 Intent 时,应用不会使用调用(如startActivity()
)执行该 Intent。相反,通过调用相应的创建器方法创建PendingIntent
时,您必须声明所需的组件类型:
PendingIntent.getActivity()
,适用于启动Activity
的Intent;
PendingIntent.getService()
,适用于启动Service
的Intent;
PendingIntent.getBroadcast()
,适用于启动BroadcastReceiver
的Intent;
除非您的应用正在从其他应用中接收待定 Intent,否则上述用于创建
PendingIntent
的方法可能是您所需的唯一PendingIntent
方法.
每种方法均会提取当前的应用
Context
、您要包装的Intent
以及一个或多个指定应如何使用该 Intent 的标志(例如,是否可以多次使用 该 Intent).
参考文献:<<安卓官方文档>>