启动Activity分为两种,显示调用和隐式调用,这里主要介绍一个隐式调用,隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果匹配不成功,将无法启动目标Activity。IntentFilter中的过滤信息有action、category、data。
一个过滤表中的action、category和data可以有多个,所有的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action类别、category类别、data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。另外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。
1.action的匹配规则
action是一个字符串,系统预定义了一些action,也可以定义自己的action。Intent中的action必须和过滤规则中的action匹配(指action的值完全一样)。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
2. category的匹配规则
category是一个字符串,category的匹配规则要求Intent中如果有category,那么所有的category都必须和过滤规则中的其中一个category相同。如果Intent中没有category,也能匹配成功,系统会默认加上“android.intent.category.DEFAULT”。
3.data的匹配规则
data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。
data语法入下:
<data android:scheme="string"
android:host="string"
android:port="stirng"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />
data由两部分组成:mimType和URI。mimeType指媒体类型,URI结构如下:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info