4.5 queryIntentActivities分析

PKMS除了负责Android系统中Package的安装、升级、卸载外,还有一项很重要的职责,就是对外提供统一的信息查询功能,其中包括查询系统中匹配某Intent的Activities、BroadCastReceivers或Services等。本节将以查询匹配某Intent的Activities为例,介绍PKMS在这方便提供的服务。

正式分析queryIntentActivities之前,先来认识一下Intent及IntentFilter。

4.5.1 Intent及IntentFilter介绍

1.Intent介绍

Intent中文是“意图”的意思,它是Android系统中一个很重要的概念,其基本思想来源于对日常生活及行为的高度抽象。我们结合用人单位招聘的例子介绍Intent背后的思想。

假设某用人单位现需招聘人员完成某项工作。该单位首先应将其需求发给猎头公司。

猎头公司从其内部的信息库中查找合适的人选。猎头公司除了考虑用人单位的需求外,还需要考虑求职者本身的要求,例如有些求职者对工作地点、加班等有要求。

二者匹配后,就会得到满足要求的求职者。之后用人单位将工作交给满足条件的人员来完成。

在现实生活中,用人单位还需和求职者进行一系列其他交互工作,例如面试、签订合同之类。但是从完成工作的角度来看,只要把工作任务交给满足要求的求职者去做即可,中间的一系列行为和工作任务本身没有太大关系。因此,Android并未将这部分内容抽象化。

意图是一个非常抽象的概念,在编码设计中,如何将它实例化呢?Android系统明确指定的一个Intent可由两方面属性来衡量。

主要属性:包括Action和Data。其中Action用于表示该Intent所表达的动作意图、Data用于表示该Action所操作的数据。

次要属性:包括Category、Type、Component和Extras。其中Category表示类别,Type表示数据的MIME类型,Component可用于指定特定的Intent响应者(例如指定广播接收者为某Package的某个BroadcastReceiver),Extras用于承载其他的信息。

如果Intent是一份用工需求表,那么上述信息就是该表的全部可填项。在实际使用中,可根据需要填写该表的内容。

当这份需求表传给猎头公司后,猎头公司就根据该表所填写的内容,进一步对Intent进行分类。

Explicit Intent:这类Intent明确指明了要找哪些人。在代码中通过setComponent或setClass来锁定目标对象。处理这种Intent,工作很轻松。

Implicit Intent:这一类Intent只标明了工作内容,而没有指定具体人名。对于这类意图,猎头公司不得不做一系列复杂的工作才能找到满足用人单位需求的人才。

Intent就先介绍到这里。下面来看在这次“招聘”过程中“求职者”填写的信息。

2.IntentFilter介绍

“求职方”需要填写IntentFilter来表达自己的诉求。Android规定了3项内容。

Action:“求职方”支持的Intent动作(和Intent中的Action对应)。

Category:“求职方”支持的Intent种类(和Intent的Category对应)。

Data:求职方支持的Intent数据(和Intent的Data对应,包括URI和MIME类型)。

至此,猎头公司已有了需求,现在又有了求职者的信息,马上要做的工作就是匹配查询。在Android中,该工作被称为Intent Resolution。由于现在及未来人才都是最宝贵的资源,因此猎头公司在做匹配工作时,将以Intent Filter列出的3项内容为参考标准,具体步骤如下:

首先匹配IntentFilter的Action,如果Intent设置的Action不满足IntentFilter的Action,则匹配失败。如果IntentFilter未设定Action,则匹配成功。

然后检查IntentFilter的Category,匹配方法同Action的匹配,唯一有些例外的是Category为CATEGORY_DEFAULT的情况。

最后检查Data。Data的匹配过程比较烦琐,因为它和IntentFilter设置的Data内容有关,见接下来的介绍。

IntentFilter中的Data可以包括两个内容。

URI:完整格式为“scheme://host:port/path”,包含4个部分,scheme、host、port和path。其中host和port合起来标识URI authority,用于指明服务器的网络地址(IP加端口号)。由于uri最多可包含4个部分,因此要根据情况相应部分做匹配检查。

Date type:指定数据的MIME类型。

要特别注意的是,uri中也可以携带数据的类型信息,所以在匹配过程中,还需要考虑uri中指定的数据类型。

提示 关于具体的匹配流程,请读者务必阅读SDK docs/guide/topics/intents/intents-filters.html中的说明。