意图匹配
组件管理服务接收到请求组件的Intent后,先查看Intent对象是否包含了目标组件Component,没有的话,组件管理服务从获取的所有组件的Intent Filter信息,与Intent对象比较,选择符合需求的实现组件。意图匹配即Intent对象与Intent Filter信息匹配过程,输出32位整数值,表示2者的匹配度。负值:失败;正:越大匹配度越高
匹配算法流程:
1.Action比较:每个Intent Filte必须包含Action对象,木有的话则对任何一个Intent都会失败。若Intent对象包含Action,而Intent Filte的Action列表空,则会匹配失败,否则进入2.
2.Data和Type比较:匹配关键。若Intent不包含Date和Type,则Intent Filte也不能包含,否则匹配失败;若Intent包含Type信息,则Intent Filte的Type信息必须与之对应,否则匹配失败;若Intent包含Data信息,则会将Data的URI拆成Scheme和Authority,逐一与Intent Filte对应部分比较,只要又不符合,则匹配失败。若匹配成功,则计算匹配值。进入3.
3.Category比较:若Intent不包含Category,则可跳过;若包含,则Category需出现在Intent Filter的Category列表中。否则匹配失败。
匹配组件选择:
如果有多个Intent Filter对象与调用组件发出的Intent对象匹配,就需要在所有符合条件的Intent Filter对象中筛选,选出最符合调用组件和用户需求的实现组件,这个流程称为匹配组件选择。
其核心机制在于基于优先级的排序。每个Intent Filter对象都有一个优先级,-1000——1000,值越大优先级越高。默认为0.可以通过<intent-filter>中的<android:priority>配置,或IntentFilter.setPriority()。
优先级高的接受完信息后,可以通过abortBroadcast()终止消息的继续传播。
意图匹配优化:
索引:Intent对象与Intent Filter对象匹配时,涉及大量字符串匹配,组件管理服务通过哈希表,为所有Intent Filter对象的Action、Type等项建立索引。
缓存:将上次Intent对象与Intent Filter对象匹配结果记录下来,在遇到相同Intent调用时,可直接返回上次记录的结果。
意图的应用:
界面组件调用:Context.startActivity()或Context.startActivityForResult()发起对目标组件调用。对于界面组件的选择,基于公平和效率的原则。效率指选择过程尽可能刘畅,减少停顿和用户参与;公平是每个符合调用者需求的组件都有平等的权利响应用户请求。具体策略是:
通过算法对已排序的Intent Filter筛选,组件管理服务会将排序后队列中的第一个Intent Filter对象A和第二个Intent Filter对象B进行比较,如果满足以下条件之一,组件管理服务就选择A:
A优先级高于B;A有Intent.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优先级排序,逐一构造。
相关推荐
在Android应用开发中,意图(Intent)是一种强大的通信机制,用于连接应用的不同组件,如活动(Activity)、服务(Service)和Broadcast Receiver。本篇将深入探讨Android中的两种主要意图类型:显示意图(Explicit ...
显式意图明确指定了目标组件的类名,而隐式意图则只指定动作和数据,由系统根据匹配规则决定目标组件。 1. 显式意图示例: ```java Intent intent = new Intent(FirstActivity.this, SecondActivity.class); start...
### Android显示意图和隐式意图的区别 在Android开发过程中,`Intent`是应用内部各组件之间进行通信的重要机制之一。通过`Intent`可以启动Activity、Service等组件,并且可以在组件间传递数据。根据使用场景的不同...
3. **意图的匹配**:意图匹配涉及到显式意图和隐式意图两种方式。 **显式意图**:显式意图是通过Intent的setComponent()或setClass()方法明确指定要启动的目标组件。例如,当你知道确切的Activity类名时,你会使用...
例如,使用意图(Intent)来处理不同组件之间的交互,比如启动一个新的活动(Activity)来展示用户匹配信息。 其次,应用的用户界面(User Interface, UI)设计是吸引用户的关键。Android提供了XML布局文件来定义UI元素,...
在Android开发中,Intent是一种至关重要的机制,它用于在不同组件之间传递消息,实现组件间的通信。Intent分为两种类型:显式意图和隐式意图。 **显式意图**: 显式意图主要用于在同一应用程序内部启动Activity。...
在Android开发中,意图(Intent)是连接应用组件的桥梁,用于在不同的组件之间传递消息,启动服务或打开新的Activity。意图筛选器(IntentFilter)则是组件(如Activity或BroadcastReceiver)用来声明它能响应哪些类型的...
4. **类型安全**:使用这些委托,我们可以确保在编译时检查类型匹配,避免运行时类型转换异常。例如,如果我们尝试从一个声明为整型的属性中获取字符串,编译器会立即报错。 5. **可空性支持**:Kotlin的可空类型...
总结,理解Intent Filter的匹配规则对于开发Android应用至关重要,因为它是组件间通信的核心机制,尤其是在使用隐式Intent时。通过正确地配置Intent Filter,开发者可以让自己的组件能够响应系统和其他应用发出的...
【Android开发API】应用的组成部分-意图和意图过滤器 在Android开发中,意图(Intent)是连接应用程序组件的重要桥梁,它允许组件之间进行通信和交互。Android的三个核心组件——活动(Activity)、服务(Service)和广播...
在Android系统中,广播接收器(BroadcastReceiver)是一种非常重要的组件,它允许应用程序接收并响应系统或应用广播的意图(Intent)。"Android广播onReceiver回调更新ui"这个主题主要涉及如何在广播接收器中处理...
在Android应用开发中,意图(Intent)是连接各个组件(如Activity、Service、BroadcastReceiver)的重要桥梁,也是数据传递的一种常见手段。本篇笔记将详细探讨Android中使用意图传递数据的几种方式,帮助开发者深入...
IntentFilter的匹配规则 IntentFilter的使用 假如我们要隐式启动一个Activity我们需要成功匹配activity中的任意一个intent-filter。如果要成功匹配该intent-filter我们需要完全匹配该intent-filter中的 action、...
5. **活动(Activity)与意图(Intent)**:在Android中,Activity代表一个屏幕,Intent用于在不同Activity之间传递数据。在婚姻建议程序中,可能有多个Activity用于不同的功能,如注册、登录、搜索和查看匹配详情。...
意图分为显式和隐式两种,显式指定接收方,隐式则基于动作和数据URI匹配。 6. **UI组件**:Android提供了丰富的UI组件,如按钮(Button)、文本框(EditText)、列表(ListView)、网格(GridView)等,开发者可以...
这个意图被Android系统捕捉到后,会启动默认的拨号应用,如Google Phone或设备厂商定制的拨号应用。拨号应用接收到这个意图后,会显示拨号键盘让用户输入号码。 当用户确认拨号后,拨号应用会创建一个`Intent....
1. **意图(Intent)**:在Android中,意图是一种对象,用于在组件之间传递消息,例如启动一个新的活动或服务。在这个案例中,可能会有一个广播接收器(BroadcastReceiver)监听接收到的短信,这通常需要定义一个...