4.2.3 意图匹配的优化
在Android意图机制中,通过引入第三方组件管理服务,降低了调用组件与实现组件之间的耦合,提高了整个系统的灵活性及组件的复用性,使得应用开发变得更为简单快捷。
但同时,正是由于第三方服务地介入增加了组件间连接的成本,可能会使组件间的调用不够流畅。因此,在组件管理服务中,系统对组件的匹配和选择过程进行了大量的优化,以提升意图匹配和组件调用的效率。
❑索引
为了找到与调用组件发出的Intent对象所匹配的组件,组件管理服务需要将Intent对象与所有的Intent Filter对象逐一进行比较,此流程涉及大量的字符串比较,比较耗时。
因此,组件管理服务会通过哈希表,为所有Intent Filter对象的Action、Type等数据项建立索引。每个索引项对应着一组Action相同、Type相同或者其他数据项相同的Intent Filter对象。Intent对象会先将其中的数据项与索引项进行比较,快速地选择出可能与Intent相匹配的Intent Filter对象。这个流程降低了需要比较的Intent Filter的集合规模,提高了速度。
为了维护索引信息,每当有组件安装或移除时,组件管理服务都需要及时更新索引项。由于组件变更的事件发生得较少,不会增加太高的维护成本。
❑缓存
所谓缓存,是将Intent与Intent Filter的匹配结果记录下来,当再碰到相同Intent的调用时,可直接返回上次记录的结果,从而跳过意图匹配的过程,加速组件的调用。
不同类型的组件,有着不同的缓存实现策略。以服务组件为例,组件管理服务会在内存中通过哈希表的形式保留各个Intent对应的服务组件。当有新的服务组件调用请求时,会先和哈希表中的记录进行比较,如果比较成功,则返回已记录的服务组件;不成功则进行意图匹配,选择出相关服务组件并记录到哈希表中。
当有组件增加或删除时,原有的组件缓存就可能失效。因此,当发生组件变更时,组件管理服务就会清理掉该组件对应的缓存信息,直到下次调用时再重新缓存。与索引的情况类似,由于组件变更的事件发生的概率很小,维护缓存所需的成本也就微不足道了。