关于Intent

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 的常见操作:

ACTION_VIEW:

如果您拥有一些某项 Activity 可向用户显示的信息(例如,要使用图库应用查看的照片;或者要使用地图应用查看的地址),请使用 Intent 将此操作与 startActivity() 结合使用.

ACTION_SEND:

这也称为“共享”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 类型:

<action>:

在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量.

<data>:

使用一个或多个指定数据 URI 各个方面(schemehostportpath 等)和 MIME 类型的属性,声明接受的数据类型.

<category>:

在 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 对象均设计为由特定类型的应用组件(ActivityService 或 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).


参考文献:<<安卓官方文档>>








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值