据
Intent 中包含的其它属性的信息,比如 action、data/type、category 进行查找,最终
找到一个与之匹配的目标组件。但是,如果
component 这个属性有指定的话,将直接使
用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,
Intent 的其它所有属
性都是可选的。
extras(附加信息),是其它所有附加信息的集合。使用 extras 可以为组件提供扩
展信息,比如,如果要执行
“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存
在
extras 里,传给电子邮件发送组件。
下面是这些额外属性的几个例子:
ACTION_MAIN with category CATEGORY_HOME //用来 Launch home screen.
以前我也写过一篇于与之有关的文章,
点击这里可以看到。
ACTION_GET_CONTENT with MIME type vnd.android.cursor.item/phone //用
来列出列表中的所有人的电话号码
综上可以看出,
action、 data/type、category 和 extras 一起形成了一种语言,这种
语言可以是
android 可以表达出诸如“给张三打电话”之类的短语组合。
三、
intent 的解析
的组件为了告诉
自己能响应、处理哪些隐式
Intent 请求,可以声明一个
甚至多个
Intent Filter。每个 Intent Filter 描述该组件所能响应 Intent 请求的能力——组件希
望接收什么类型的请求行为,什么类型的请求数据。比如之前请求网页浏览器这个例子中,网页
浏览器程序的
Intent Filter 就应该声明它所希望接收的 Intent Action 是
WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址 URI 格式。如何为组件声明自己
的
Intent Filter? 常见的方法是在 AndroidManifest.xml 文件中用属性< Intent-Filter>描述
组件的
Intent Filter。
前面我们提到,隐式
Intent(Explicit Intents)和 Intent Filter(Implicit Intents)进
行比较时的三要素是
Intent 的动作、数据以及类别。实际上,一个隐式 Intent 请求要能够传递给
目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,
Android 都不会将该隐式
Intent 传递给目标组件。接下来我们讲解这三方面检查的具体规则。
1.动作测试
代码
< intent-filter>元素中可以包括子元素< action>,比如: < intent-filter> <
action android:name=”com.example.project.SHOW_CURRENT” /> < action
android:name=”com.example.project.SHOW_RECENT” /> < action
android:name=”com.example.project.SHOW_PENDING” /> < /intent-filter>
一条
< intent-filter>元素至少应该包含一个< action>,否则任何 Intent 请求都不
能和该
< intent-filter>匹配。如果 Intent 请求的 Action 和< intent-filter>中个某一条<
action>匹配,那么该 Intent 就通过了这条< intent-filter>的动作测试。如果 Intent 请求或
< intent-filter>中没有说明具体的 Action 类型,那么会出现下面两种情况。