Android意图匹配

意图匹配

组件管理服务接收到请求组件的Intent后,先查看Intent对象是否包含了目标组件Component,没有的话,组件管理服务从获取的所有组件的Intent Filter信息,与Intent对象比较,选择符合需求的实现组件。意图匹配即Intent对象与Intent Filter信息匹配过程,输出32位整数值,表示2者的匹配度。负值:失败;正:越大匹配度越高

匹配算法流程:

1.Action比较:每个Intent Filte必须包含Action对象,木有的话则对任何一个Intent都会失败。若Intent对象包含Action,而Intent FilteAction列表空,则会匹配失败,否则进入2.

2.DataType比较:匹配关键。若Intent不包含DateType,则Intent Filte也不能包含,否则匹配失败;若Intent包含Type信息,则Intent FilteType信息必须与之对应,否则匹配失败;若Intent包含Data信息,则会将DataURI拆成SchemeAuthority,逐一与Intent Filte对应部分比较,只要又不符合,则匹配失败。若匹配成功,则计算匹配值。进入3.

3.Category比较:若Intent不包含Category,则可跳过;若包含,则Category需出现在Intent FilterCategory列表中。否则匹配失败。

 

匹配组件选择:

如果有多个Intent Filter对象与调用组件发出的Intent对象匹配,就需要在所有符合条件的Intent Filter对象中筛选,选出最符合调用组件和用户需求的实现组件,这个流程称为匹配组件选择

其核心机制在于基于优先级的排序。每个Intent Filter对象都有一个优先级,-1000——1000,值越大优先级越高。默认为0.可以通过<intent-filter>中的<android:priority>配置,或IntentFilter.setPriority()

优先级高的接受完信息后,可以通过abortBroadcast()终止消息的继续传播。

 

扫描二维码关注公众号,回复: 673418 查看本文章

意图匹配优化:

索引Intent对象与Intent Filter对象匹配时,涉及大量字符串匹配,组件管理服务通过哈希表,为所有Intent Filter对象的ActionType等项建立索引。

缓存:将上次Intent对象与Intent Filter对象匹配结果记录下来,在遇到相同Intent调用时,可直接返回上次记录的结果。

 

意图的应用:

界面组件调用Context.startActivity()Context.startActivityForResult()发起对目标组件调用。对于界面组件的选择,基于公平和效率的原则。效率指选择过程尽可能刘畅,减少停顿和用户参与;公平是每个符合调用者需求的组件都有平等的权利响应用户请求。具体策略是:

通过算法对已排序的Intent Filter筛选,组件管理服务会将排序后队列中的第一个Intent Filter对象A和第二个Intent Filter对象B进行比较,如果满足以下条件之一,组件管理服务就选择A

A优先级高于BAIntent.CATEGORY_DEFAULT,B .

再次系统请求时,则直接选用对应的组件。

 

为了增强用户对备选组件的掌控能力,自定义组件选择样式,可以通过PackageManager.queryIntentActivities()获取与Intent匹配的所有对象列表:

List<ResolveInfo> activities = get PackageManager.queryIntentActivities(intent , PackageManager.MATCH_DEFAULT_ONLY);

//用这些activities显示在交互界面

 

服务组件调用

调用服务通过Context.startService()启动服务组件。或通过Context.bindServier()绑定服务组件。

组件管理服务受到Intent请求后,寻找所有符合条件的服务组件,按照Intent Filter优先级排序,默认选择优先级最高的作为服务组件。

 

触发器调用

触发器用于监听广播事件的Intent对象,并对其进行简单解析和处理,调用组件通过Context.sendBroadcast()Context.sendOrderedBroadcast()广播,载体是Intent

广播的Intent与界面组件的Intent是分离的,不会混淆。

 

触发器组件构造中,不存在匹配组件选择的问题,广播的意义在于通知每一个监听该事件的组件。通过Context.sendBroadcast(),组件管理服务会以此构造所有与Intent相匹配的触发器;通过Context.sendOrderedBroadcast(),组件管理服务会按照Intent Filter优先级排序,逐一构造。

猜你喜欢

转载自aoyouzi.iteye.com/blog/1986746