`
isiqi
  • 浏览: 16494663 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android之隐式意图(Intent)如何查找匹配的组件

阅读更多

【0】Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

【1】Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

【2】对于隐式意图,Android是怎样寻找到这个最合适的组件呢?

记的前面我们在定义活动时,指定了一个intent-filterIntent Filter(意图过滤器其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。

动作测试(Action test)

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。

另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试(Category test)

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。

原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" CATEGORY_DEFAULT常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN""android.intent.category.LAUNCHER"设置的过滤器是例外)

数据测试(Data test)

当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。例如,如果过滤器仅指定了一个scheme,所有该schemeURIs都能够和这个过滤器相匹配;如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

数据测试同时比较意图对象和过滤器中指定的URI和数据类型。

规则如下:

a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。

b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:tel:这样的URIs上:它们并不引用实际数据。

c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。

d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持content:file: 数据如果它的过滤器仅列举了一个数据类型。

注意上面隐式意图设置匹配规则的方法,intent.setType(type);注意这个方法会清除setData的内容,所以如果既要设置类型与数据,那么使用setDataAndType

分享到:
评论

相关推荐

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

    本篇将深入探讨Android中的两种主要意图类型:显示意图(Explicit Intent)和隐式意图(Implicit Intent),以及它们在实际应用中的角色和用法。 首先,我们来理解一下**显示意图**。显示意图是明确指定目标组件的...

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

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

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

    通过隐式意图启动SecondActivity,需要在AndroidManifest.xml中为SecondActivity定义一个Intent-filter,包含相应的Action和Category,这样当在FirstActivity中触发这个Intent时,系统会查找匹配的过滤器并启动对应...

    利用隐式意图激活组件

    2. **匹配隐式意图**: 系统会根据Intent的Action、Data和Category等信息,遍历所有已注册的IntentFilter,找到能够处理这个Intent的组件。 3. **设置MIME类型**: 当处理文件时,需要设置正确的MIME类型,以便系统...

    隐式意图过滤规则

    "隐式意图过滤规则"是IntentFilter的核心特性,它允许一个组件(如Activity或Service)声明它可以处理特定类型的Intent,即使发送Intent的应用程序并不知道接收端的具体组件。下面将详细介绍IntentFilter的各个组成...

    隐式意图跳转Activity

    隐式意图(Implicit Intent)不直接指定目标组件的类名,而是通过定义一个行动(Action)、数据(Data)、类别(Category)和额外的数据(Extras)来表达开发者想要执行的操作。系统会根据这些信息遍历...

    Android学习总结-Intent详解.doc

    当使用隐式Intent时,系统会遍历所有注册了Intent Filter的组件,通过匹配action、category、data等属性来找到最合适的响应者。组件的AndroidManifest.xml中定义的Intent Filter包含了这些属性,用于声明组件能处理...

    Android应用源码之Intent.zip

    - 隐式Intent:不指定具体组件,而是通过Action、Data、Category等元数据来定义一个意图,任何能够处理这些元数据的组件都可以响应。 2. **Intent构造器**: - `Intent(Context packageContext, Class<?> cls)`:...

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

    Intent分为两种类型:显式意图和隐式意图。 **显式意图**: 显式意图主要用于在同一应用程序内部启动Activity。通过调用`Intent.setComponent()`或`Intent.setClass()`方法,我们可以明确指定目标组件的名称,使得...

    android整合--intent

    2. 隐式Intent:隐式Intent不指定特定的接收者,而是根据Intent的数据(如Action、Data、Category等)来匹配能够处理该Intent的组件。这种方式允许不同的应用程序组件共享功能,增强了系统的可扩展性。 三、Intent...

    利用隐式意图实现两个apk之间的数据传递

    隐式意图与显式意图的主要区别在于,显式意图直接指定要启动的目标组件,而隐式意图则是通过定义行动(Action)、数据(Data)、类别(Category)等元数据来广播,让系统根据这些信息来寻找能够处理该意图的合适组件...

    Android 隐式Intent的实例详解

    Android 隐式Intent 是一种特殊的 Intent,用于在不明确设置激活对象的前提下寻找最匹配的组件。它的核心思想是通过在 AndroidManifest.xml 文件中设置意图过滤器,来指定 Activity 的属性,然后在程序中设置匹配的...

    Android中intent的使用

    - CATEGORY:定义Intent的类别,如CATEGORY_DEFAULT、CATEGORY_APP_MUSIC等,用于增加匹配组件的条件。 - Extras:额外的数据,可以使用Bundle对象存储键值对,传递复杂数据。 在实际开发中,我们通常会使用`...

    Android应用核心Intent

    系统会根据Intent的动作、数据、类别等信息,查找并启动最匹配的组件。 6. **Intent Flag** - FLAG_ACTIVITY_NEW_TASK:启动新的任务栈,通常用于启动主Activity。 - FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity...

    android中intent使用示例

    显式Intent通过指定组件的全名(包括包名和类名)来直接启动目标组件,而隐式Intent则是通过设置Action、Data、Category等元数据来匹配能够处理该Intent的组件。 1. 显式Intent的使用: 在创建显式Intent时,我们...

    Android应用源码之Intent_DataSample.zip

    隐式Intent不指定具体组件,而是根据Intent的Action、Data、Category等信息让系统自动匹配合适的组件。 2. **Intent的构造** - `Intent intent = new Intent();` 创建一个空的Intent对象。 - `Intent intent = ...

    android intent and intent-filters

    - 隐式Intent:不指定具体组件,而是通过Action、Data、Category等元数据描述Intent意图,由系统根据这些信息寻找最适合处理Intent的组件。 2. Intent的主要组成部分: - Action:描述Intent要执行的操作,如...

    android中使用显式intent完成应用的步骤及核心代码2022优秀文档.pptx

    在隐式Intent中,Android系统需要帮助应用程序寻找与Intent请求意图最匹配的组件。 知识点7: Intent的作用 Intent是一种在不同组件之间传递请求消息的机制,是应用程序发出的请求和意图。Intent使得应用程序之间的...

Global site tag (gtag.js) - Google Analytics