4.1.4 Intent Filter对象

除了Intent对象,在Android意图机制中还有一个重要的角色:Intent Filter对象。Intent Filter对象,指的是android.content.IntentFilter类的对象,它是Intent对象的“姊妹对象”。与Intent对象类似,Intent Filter对象也包含Action、Type、Data、Category等数据项,每个数据项的结构和含义,与Intent中的数据项也一一对应。

从用途来看,Intent Filter是各个组件用于描述其功能的,通过组件的Intent Filter信息,Android的组件管理应用就可以了解和掌握各个组件所具备的能力和能够处理的请求。当组件管理服务接收到调用组件发送来的基于模糊描述的Intent对象时,会与所有组件的Intent Filter信息进行匹配计算,寻找符合需求的实现组件。

每个组件都可以有任意数量的Intent Filter。组件包含的Intent Filter对象越多,说明它能够接受Intent请求的范围越广,同时,其实现也会越复杂。而不添加任何Intent Filter对象的组件,仅能够通过Intent对象精确地进行调用,此类组件通常都在应用内部使用。

组件对应的Intent Filter信息,一般通过配置文件的<intent-filter>项进行添加,[1]放在界面组件、服务组件或触发器组件的配置项中[2],比如:


<!—Intent Filter对象可以放在activity等组件配置项中—>

<activity>

<intent-filter android:icon="…"

android:label="…"

android:priority="…">

<action android:name="…"/>

<category android:name="…"/>

<data android:host="…"

android:mimeType="…"

android:path="…"

android:pathPattern="…"

android:port="…"

android:scheme="…"/>

<!—可以继续添加相关的action、category和data项—>

</intent-filter>

<!—可以继续添加相关的intent-filter项—>

</activity>


<intent-filter>的配置项中,除了基本的名字和图标等配置信息外,最重要的是包含了若干的<action>、<category>和<data>项,它们分别对应于Intent对象中的Action、Category、Data和Type等信息。

❑Action项

在每个Intent Filter对象中,都必须包含Action信息,它与Intent对象中的Action相对应。不同的是,每个Intent Filter对象都可包含多个Action项,表示该Intent Filter对象同时支持多种Action(“或”的关系)。

通过配置文件中的<action>项(作为<intent-filter>的子项),可以为Intent Filter对象添加Action信息,此外,也可以通过IntentFilter.addAction函数动态地添加。

对于大部分Intent Filter对象而言,都只会包含一个Action项。如果一个组件期望支持多种Action,最常见的方式是添加多个Intent Filter对象。只有不同的Action对应的Intent Filter的其他数据项完全一致时,才会考虑把多个Action添加到同一个Intent Filter对象中。

❑Category项

与Intent对象类似,在Intent Filter对象中,同样可包含若干个Category项,以表示该Intent Filter对象能够接受的Category分类。

在同一Intent Filter对象中的各个Category项,其关系与Intent对象中的有所不同。它们是一种“或”的关系,表示该Intent Filter无论满足其中哪一个Category约束,都可以接受对应的Intent请求。

Category项可以通过配置文件中的<category>项进行添加(同样是作为<intent-filter>的子项),也可以通过IntentFilter.addCategory函数动态添加。

❑Data和Type项

Intent Filter对象中也包含可接受数据的范围和类型相关的数据项。在Intent对象中,调用组件是通过Data项和Type项来表述所需要的数据地址和数据类型信息的,而在Intent Filter对象中,描述实现组件可接受数据类型的方式则更为丰富和灵活。

通过<intent-filter>的子配置项<data>,可以为Intent Filter对象添加可接受的数据信息。<data>配置项中含有android:mimeType属性,它对应着Intent的Type信息,表示该Intent Filter可以接受的数据类型。

除此之外,<data>中的其他属性信息都对应着Intent的Data信息。在Intent对象中,Data项通过URI来表示数据地址,图4-2描绘了<data>中的各项与URI的对应关系。

4.1.4 Intent Filter对象 - 图1

图 4-2 Intent Filter中Data信息对应的配置项

在URI中,android:scheme对应着URI的scheme部分,表示该URI所指数据服务的具体类别;android:host和android:port则共同构成了URI的authority部分,表示URI对应的域名信息;而URI的具体路径信息,可以通过android:path、android:pathPrefix或android:pathPattern来描述。其中,android:path表示完整的路径信息,android:pathPrefix表示的是路径信息的前缀,而更复杂的路径信息则可以通过android:pathPattern来表示—它可以利用通配符*表示0个或多个字符信息,进行模糊匹配。

[1]只有通过Context.registerReceiver函数进行“热插拔”安装的触发器组件才通过代码来构造和添加Intent Filter对象。

[2]关于Intent-filter的更多配置信息,参见SDK文档:http://developer.android.com/guide/topics/manifest/intent-filter-element.html。