Implicit Intent 到底发给哪个activity?
这需要进行三个匹配,一个是action,一个是category,一个是data。根据三个的匹配结果,找到应该启动的Activity。
Action Implicit Intent
动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。
一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。
<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。
Category Implicit Intent
种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。
<intent-filter>元素可以包含<category>子元素,比如:
<intent-filter . . . >
<category android:name=”android.Intent.Category.DEFAULT” />
<category android:name=”android.Intent.Category.BROWSABLE” />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。
Data Implicit Intent
Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。
mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。
scheme是URI部分的协议——例如,http:,mailto:,tel:。
host-name或“data authority”是介于URI中scheme和path之间的部分(例如,www.google.com)。匹配主机名时,Intent Filter的scheme也必须通过匹配。
数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。
数据在<intent-filter>中的描述如下:
<intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
分享到:
相关推荐
`<intent-filter>`标签定义了一个或多个条件(如Action、Category和Data等),用于匹配Intent中的相应字段。当Intent中的字段与`<intent-filter>`中的条件完全匹配时,Activity才可被成功启动。 #### 二、Intent ...
当发送隐式Intent时,系统会根据Intent的属性匹配Intent Filter,找到最适合的接收者。如果找不到匹配项,系统会抛出异常。 六、Intent的生命周期管理 Intent的使用需考虑到组件的生命周期。例如,使用FLAG_...
- 系统通过`PackageManager`服务和`IntentFilter`来解析和匹配Intent。IntentFilter是组件(如Activity)声明它可以处理的Intent类型。 - 当发送隐式Intent时,系统会遍历所有注册的IntentFilter,根据Action、...
- 一个Intent至少匹配Intent-filter中的一个Action和Data,Category是可选的。 - 数据匹配:Intent的数据URI和MIME类型需要与Intent-filter中的data元素匹配。 - 如果Intent没有提供Data,那么Intent-filter的...
- 包含Action、Data、Category等信息,用于匹配Intent。 6. **Intent Resolution**: - Android系统根据Intent中的Action、Data和Category等信息,通过IntentFilter匹配最合适的组件进行调用。 7. **Intent的...
过滤器通过设置Action、Data、Category等属性,使得系统可以根据这些属性匹配Intent。 例如,创建一个能处理HTTP链接的Activity: ```xml <intent-filter> <action android:name="android.intent.action.VIEW" /...
- Android系统通过`IntentFilter`来解析和匹配Intent。每个组件(Activity、Service)可以声明多个IntentFilter,根据其定义的动作、数据、类别等条件来接收Intent。 6. **Intent与组件间的通信** - Activity之间...
4. **优先级**:如果有多个组件都匹配Intent,系统会按照优先级和Intent的FLAG设置决定启动哪个组件。 三、应用例子:Activity之com.google.android.notepad.NotesList 在实际应用中,比如Google的NotePad应用,`...
在AndroidManifest.xml中,每个组件(Activity或BroadcastReceiver)可以通过`<intent-filter>`标签声明它可以处理的Intent类型,包括ACTION、DATA(URI)、CATEGORY等,系统会根据这些信息匹配Intent。 6. **数据...
IntentFilter是Intent的过滤器,用于匹配Intent。在BroadcastReceiver或Activity中定义IntentFilter,可以指定Intent的行动、数据和类别,使得只有满足条件的Intent才能被接收。 8. **Service与Intent** Service...
- 对于隐式Intent,必须确保至少有一个组件能匹配Intent的所有过滤器,否则系统会抛出异常。 - 使用Intent传递数据时,记得在接收端检查是否存在键值对,避免空指针异常。 总结,Android Intent是实现页面跳转和...
IntentFilter包含Action、Category、Data和Type等元素,用于过滤和匹配Intent。 5. **Intent的创建与使用**: 创建Intent时,可以使用构造函数,如`new Intent(context, TargetClass)`来启动一个指定的Activity,...
- 隐式Intent需要在接收组件(如Activity或BroadcastReceiver)的清单文件中声明IntentFilter,以匹配Intent的各种属性。 - IntentFilter包括action、data、category等,只有当Intent的这些属性与IntentFilter匹配...
过滤器包含Action、Data和Category,系统会根据过滤器匹配Intent。 9. 源码分析 在Android源码中,Intent类的实现涉及许多关键方法,如`filterEquals()`, `resolveActivity()`, `toURI()`, `parseIntent()`等。理解...
IntentFilter用于匹配Intent,定义了Intent必须满足的条件,如动作、数据类型、类别等。源码中,IntentFilter的配置是关键,它决定了Intent是否会被特定组件接收。 10. **生命周期管理**: 在处理Intent时,需要...
过滤器包含Action、Category和Data,系统会根据这些信息决定哪个组件匹配Intent。 8. **BroadcastReceiver**:Intent还可以用于触发BroadcastReceiver,通过注册BroadcastReceiver来监听特定的Intent。这在跨组件...
任何注册了匹配Intent Filter的组件都可以响应这个Intent。这种方式降低了发送者和接收者之间的依赖,使得组件间的通信更加灵活。例如,你可能想要打开一个网页,但并不关心是哪个应用(如Chrome或Firefox)来处理这...