background image

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 的解析 

应用程序

组件为了告诉

Android

己能响应、处理哪些隐式

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.动作测试

  

Java

 < 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 类型,那么会出现下面两种情况。