`

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()终止消息的继续传播。

 

意图匹配优化:

索引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优先级排序,逐一构造。

分享到:
评论

相关推荐

    Android review 显示意图激活与隐式意图激活

    在Android应用开发中,意图(Intent)是一种强大的通信机制,用于连接应用的不同组件,如活动(Activity)、服务(Service)和Broadcast Receiver。本篇将深入探讨Android中的两种主要意图类型:显示意图(Explicit ...

    Android学习笔记(十)——使用意图链接活动

    显式意图明确指定了目标组件的类名,而隐式意图则只指定动作和数据,由系统根据匹配规则决定目标组件。 1. 显式意图示例: ```java Intent intent = new Intent(FirstActivity.this, SecondActivity.class); start...

    android显示意图和隐式意图的区别

    ### Android显示意图和隐式意图的区别 在Android开发过程中,`Intent`是应用内部各组件之间进行通信的重要机制之一。通过`Intent`可以启动Activity、Service等组件,并且可以在组件间传递数据。根据使用场景的不同...

    Android显示意图隐式意图的区别[文].pdf

    3. **意图的匹配**:意图匹配涉及到显式意图和隐式意图两种方式。 **显式意图**:显式意图是通过Intent的setComponent()或setClass()方法明确指定要启动的目标组件。例如,当你知道确切的Activity类名时,你会使用...

    Android-猿匹配——国内首个程序猿非严肃婚恋交友应用让我们一言不合就来场匹配吧

    例如,使用意图(Intent)来处理不同组件之间的交互,比如启动一个新的活动(Activity)来展示用户匹配信息。 其次,应用的用户界面(User Interface, UI)设计是吸引用户的关键。Android提供了XML布局文件来定义UI元素,...

    Android学习之Intent中显示意图和隐式意图的用法实例分析

    在Android开发中,Intent是一种至关重要的机制,它用于在不同组件之间传递消息,实现组件间的通信。Intent分为两种类型:显式意图和隐式意图。 **显式意图**: 显式意图主要用于在同一应用程序内部启动Activity。...

    Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

    在Android开发中,意图(Intent)是连接应用组件的桥梁,用于在不同的组件之间传递消息,启动服务或打开新的Activity。意图筛选器(IntentFilter)则是组件(如Activity或BroadcastReceiver)用来声明它能响应哪些类型的...

    android-extras-delegates,kotlin属性委托管理android意图和bundle extra.zip

    4. **类型安全**:使用这些委托,我们可以确保在编译时检查类型匹配,避免运行时类型转换异常。例如,如果我们尝试从一个声明为整型的属性中获取字符串,编译器会立即报错。 5. **可空性支持**:Kotlin的可空类型...

    Android中的Intent Filter匹配规则简介

    总结,理解Intent Filter的匹配规则对于开发Android应用至关重要,因为它是组件间通信的核心机制,尤其是在使用隐式Intent时。通过正确地配置Intent Filter,开发者可以让自己的组件能够响应系统和其他应用发出的...

    【Android开发API】应用的组成部分-意图和意图过滤器.pdf

    【Android开发API】应用的组成部分-意图和意图过滤器 在Android开发中,意图(Intent)是连接应用程序组件的重要桥梁,它允许组件之间进行通信和交互。Android的三个核心组件——活动(Activity)、服务(Service)和广播...

    Android广播onReceiver回调更新ui

    在Android系统中,广播接收器(BroadcastReceiver)是一种非常重要的组件,它允许应用程序接收并响应系统或应用广播的意图(Intent)。"Android广播onReceiver回调更新ui"这个主题主要涉及如何在广播接收器中处理...

    Android学习笔记(十二)——使用意图传递数据的几种方式

    在Android应用开发中,意图(Intent)是连接各个组件(如Activity、Service、BroadcastReceiver)的重要桥梁,也是数据传递的一种常见手段。本篇笔记将详细探讨Android中使用意图传递数据的几种方式,帮助开发者深入...

    Android 中IntentFilter的匹配规则实例详解

    IntentFilter的匹配规则 IntentFilter的使用 假如我们要隐式启动一个Activity我们需要成功匹配activity中的任意一个intent-filter。如果要成功匹配该intent-filter我们需要完全匹配该intent-filter中的 action、...

    Marriage Suggestion Program - Android Studio

    5. **活动(Activity)与意图(Intent)**:在Android中,Activity代表一个屏幕,Intent用于在不同Activity之间传递数据。在婚姻建议程序中,可能有多个Activity用于不同的功能,如注册、登录、搜索和查看匹配详情。...

    AndroidAPI中文手册

    意图分为显式和隐式两种,显式指定接收方,隐式则基于动作和数据URI匹配。 6. **UI组件**:Android提供了丰富的UI组件,如按钮(Button)、文本框(EditText)、列表(ListView)、网格(GridView)等,开发者可以...

    Android高级应用源码-android仿淘宝,自动获取短信验证码 demo.rar

    1. **意图(Intent)**:在Android中,意图是一种对象,用于在组件之间传递消息,例如启动一个新的活动或服务。在这个案例中,可能会有一个广播接收器(BroadcastReceiver)监听接收到的短信,这通常需要定义一个...

    Android 常用开发术语(Word格式)

    调用者发送意图到 Android 意图处理器,意图处理器会遍历所有应用程序的意图过滤器来查找与该意图最匹配的 Activity。 11. 意图过滤器(intent-filter) Activity 和意图接收器(Receiver)在它们的文件清单中包含一个...

Global site tag (gtag.js) - Google Analytics