浅谈Intent匹配规则

我们知道,启动Activity分为隐式调用和显示调用两种方式。显示调用必须明确指定被调用对象的组件信息,包括包名和类名,这种调用很简单,我们着重来说下隐式调用。
隐式调用不需明确指定被调用对象的组件信息,开启时需要给inten指定明确的匹配信息,intent要能够匹配目标组件在intentFilter中设置的匹配信息,如果匹配失败,那就无法启动目标组件。
IntentFilter中的过滤信息包括:action,category,data,intent只有将这三项全部匹配成功,才算真正的匹配成功。接下来我们分别介绍下这三项的详细匹配规则。

1. action的匹配规则
action是一个字符串,系统为我们预置了一些action,我们也可以在IntentFilter中配置自己的action,可以配置单个或者多个。只要intent的action与IntentFilter中的任何一个action匹配上了(字符串完全一样,区分大小写),那就算匹配成功。这里需要强调下,intent中必须设置action,否则匹配失败。

2. category的匹配规则
category是一个字符串,系统为我们预置了一些category,我们也可以在IntentFilter中配置自己的category,可以配置单个或者多个。categoryaction的匹配规则有些不同:
① 如果intent中设置了category,那么设置的category必须是在IntentFilter中已经配置的,换句话说,只要intent中设置的category与IntentFilter中配置的多个category中的任意一个匹配上了就算匹配成功,否则匹配失败。从这个匹配规则来看,与action是相同的。
② 如果intent中没有设置category,那么匹配也是可以成功的,因为系统会为intent添加一个默认的category,android.intent.category.DEFAULT,对应intentFilter中的:

这里需要注意一点,intentFilter中必须配置这一默认项,否则这个组件将不会接受默认category的隐式调用。说到底,还是得遵循①规则,只是系统会给我们添加默认值,并不代表intent里面就不需要category

3. data的匹配规则
data的匹配规则与action相似,如果intenrFilter中配置了data,那么必须要在在intent中设置data, 在intent中设置的data,必须是在intentFilter中设置过的。换句话说,data不是匹配时必须存在的信息。data的结构由:mimeTypeURI两部分组成。
mimeType:指媒体类型,比如image/jpeg,audio/mpeg4-generic,video/* 等。
URI:包含的信息有:scheme,host,port,pathPattern,例:http://zb.com:80/mian/infoscheme是uri的模式,比如http,file,content等,如果没有指定scheme,则整个uri的其他参数无效,意味着uri无效。host是uri的主机名,如果host未指定,则整个uri的其他参数无效,意味着uri无效。port是uri端口号,仅当schemehost存在才有意义。pathPattern表述路径信息,里面可以包含*通配符,表示0个或多个任意字符。
需要主要的一点是:mimeType必须在intentFilter的data中配置,但是URI可以不用配置,有默认值:file,content
例:

<intent-filter> 
<data 
android:mimeType="image/*"
 />

我们根据intentFilter中的data配置,可以给出:

intent.setDataAndType(Uri.parse("file://zb"),"image/png")

另外,要为intent设置完整的data,必须调用setDataAndType,不能先后调用setDatasetType,因为后面的会把前面设置的覆盖掉。

最后我们给出一个例子,把这三种匹配规则应用一下:

            

            "com.zb.action.test1" />
            "com.zb.action.test2"/>

            "com.zb.category.test1"/>
            "com.zb.category.test2"/>
            "android.intent.category.DEFAULT"/>

            "http"
                android:host="zb"
                android:mimeType="image/*"
                />

            


        Intent intent = new Intent();

        //或者intent.setAction("com.zb.action.test1");
        intent.setAction("com.zb.action.test2");

        //可以不设置category,采用默认的
        intent.addCategory("com.zb.category.test1");
        intent.addCategory("com.zb.category.test1");

        intent.setDataAndType(Uri.parse("http://zb"),"image/png");

你可能感兴趣的:(Android,Activity)