本文最后更新于:1 个月前
Intent
是一个消息传递对象,可以通过多种方式促进组件之间的通信。
其基本用例主要包括以下三个:
- 启动 Activity
- 启动服务
- 传递广播
Keyword: 闹钟, 日历, 相机, 联系人, 文件存储, 地图, 音乐和视频, 新笔记, 电话, 设置发送短信
Intent和Intent过滤器
要仅设置数据 URI,请调用
setData()
。要仅设置 MIME 类型,请调用setType()
。如有必要,可以使用setDataAndType()
同时显式设置二者。若要同时设置 URI 和 MIME 类型,请勿调用setData()
和setType()
,因为它们会互相抵消彼此的值。请始终使用setDataAndType()
同时设置 URI 和 MIME 类型。
要接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。方法 startActivity() 和 startActivityForResult() 将按照其声明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。
Intent 解析
操作测试
要指定接受的 Intent 操作,Intent 过滤器既可以不声明任何 <action>
元素,也可以声明多个此类元素。要通过此过滤器,在 Intent 中指定的操作必须与过滤器中列出的某一操作匹配。
如果该过滤器未列出任何操作,则 Intent 没有任何匹配项,因此所有 Intent 均无法通过测试。但是,如果 Intent 未指定操作,则只要过滤器内包含至少一项操作,就可以通过测试。
类别测试
要指定接受的 Intent 类别,Intent 过滤器既可以不声明任何 <category>
元素,也可以声明多个此类元素。若要使 Intent 通过类别测试,则 Intent 中的每个类别均必须与过滤器中的类别匹配。反之则未必然,Intent 过滤器声明的类别可以超出 Intent 中指定的数量,且 Intent 仍会通过测试。因此,不含类别的 Intent 应当始终会通过此测试,无论过滤器中声明何种类别均是如此。
数据测试
要指定接受的 Intent 数据,Intent 过滤器既可以不声明任何 <data>
元素,也可以声明多个此类元素。每个 <data>
元素均可指定 URI 结构和数据类型(MIME 媒体类型)。URI 的每个部分都是一个单独的属性:scheme
、host
、port
和 path
:<scheme>://<host>:<port>/<path>
。
在 <data>
元素中,上述每个属性均为可选,但存在线性依赖关系:
- 如果未指定架构,则会忽略主机。
- 如果未指定主机,则会忽略端口。
- 如果未指定架构和主机,则会忽略路径。
数据测试会将 Intent 中的 URI 和 MIME 类型与过滤器中指定的 URI 和 MIME 类型进行比较。规则如下:
- 仅当过滤器未指定任何 URI 或 MIME 类型时,不含 URI 和 MIME 类型的 Intent 才会通过测试。
- 对于包含 URI 但不含 MIME 类型(既未显式声明,也无法通过 URI 推断得出)的 Intent,仅当其 URI 与过滤器的 URI 格式匹配、且过滤器同样未指定 MIME 类型时,才会通过测试。
- 仅当过滤器列出相同的 MIME 类型且未指定 URI 格式时,包含 MIME 类型但不含 URI 的 Intent 才会通过测试。
- 仅当 MIME 类型与过滤器中列出的类型匹配时,同时包含 URI 类型和 MIME 类型(通过显式声明,或可以通过 URI 推断得出)的 Intent 才会通过测试的 MIME 类型部分。如果 Intent 的 URI 与过滤器中的 URI 匹配,或者如果 Intent 具有
content:
或file:
URI 且过滤器未指定 URI,则 Intent 会通过测试的 URI 部分。换言之,如果过滤器只是列出 MIME 类型,则假定组件支持content:
和file:
数据。
如果 Intent 指定 URI 或 MIME 类型,则数据测试会在
<intent-filter>
中没有<data>
元素时失败。
通用Intent
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!