Activity隐式启动时候IntentFilter的匹配规则

Activity的隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,不匹配将无法启动目标组件Activity。一个Activity中可以设置多组IntentFilter,而每组IntentFilter中的过滤信息有action ,category,data.也可以有多个。
Activity隐式启动时候IntentFilter的匹配规则_第1张图片

一个Intent只要能够匹配任意一组intent-filter,即可成功启动对应的Activity
要匹配任何一组intent-filter,就要同时匹配action类别,category类别,data类别

使用隐式调用要求IntentFilter必须定义action和category,data可以没有。其中category android:name=”android.intent.category.DEFAULT”是一定要设置的。因为启动的时候Intent会默认加上这个category。否则的话无法启动。

            <intent-filter>
                <action android:name="com.app.webview" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="nbenjnbpeui" />
                <category android:name="12345566789"/>
                <category android:name="android.intent.category.DEFAULT" />

                <data  android:scheme="http" android:host="192.168.1.1" android:port="8080" android:path="/eyishion/article/details/" android:pathPattern=".*" android:pathPrefix="/123456789" android:mimeType="image/*"/>
            </intent-filter>

分别介绍各个类别的匹配规则:
1.action的匹配规则:
Intent中的action必须和intent-filter中的某一个action相同。

                Intent i = new Intent();
                i.setAction("com.app.webview");
                //或者,两个随便写一个就可以
                i.setAction("android.intent.action.VIEW");

2.category的匹配规则:
Intent中如果含有category,那么所有的category都必须和intent-filter中的某一个category相同。
它和action的不同是Intent要求必须有一个action且和infiliter中的某一个action相同(这是Activity的隐式调用所必须的,)
Intent中category可以没有category,因为它启动的时候默认会追加一个android.intent.category.DEFAULT,所以这也就要求intent-filiter中必须有android.intent.category.DEFAULT

                // 可以不写,可任意写一个,或两个都写
                i.addCategory("12345566789");
                i.addCategory("nbenjnbpeui");

3.data的匹配规则:
intent-filter如果定义了data,那么Intent中的data必须和Itent-filter中某一个data相同
data是有两部分组成,mimeTypeURI。mimeType是指媒体类型
data的语法示例:

                    <data
                    android:scheme="http"
                    android:host="192.168.1.1"
                    android:port="8080"
                    android:path="/eyishion/article/details/"
                    android:pathPattern=".*"
                    android:pathPrefix="/123456789"
                    android:mimeType="image/*"/>

URI的结构:
< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPattern>]
String url =”http://192.168.1.1:8080/eyishion/article/details/”;
在匹配URI的时候要求前面scheme , host , port 必须一模一样,而对于path ,pathPrefix ,pathPattern只要有一个正确就能够完全匹配整个URI了。
scheme:URI的模式,比如http ,file ,content等,如果URI中没有指定scheme,那么整个URI的其他参数,无效,也意味着URI无效。 android:mimeType有的话,mimiType依然有效,它和URI无关。
Host:URI的主机名,比如上面192.168.1.1,如果Host未指定,那么整个URI中的其他参数也是无效的,这也就意味着URI是无效的。
Port:URI的端口号,比如上面8080,仅当URI中指定了scheme和host参数的时候port参数才是有意义的。
path:表示完整的路径信息,比如上面/eyishion/article/details/
pathPattern:也表示完整的路径信息,它里面可以使用正则表达式匹配路径,比如 .* 可以匹配上面的路径
pathPrefix:表示路径的前缀信息。比如可以是/或者/e或者/eyishion,跟路径前面字符随意几个字符相同就ok.
path ,pathPrefix ,pathPattern,这三个值只要有一个正确就可以。

上面那个data要匹配的话,可以这样来写

String url ="http://192.168.1.1:8080/eyishion/article/details/";
i.setDataAndType(Uri.parse(uri), "image/*");

另外不能这样写
i.setData(Uri.parse(uri));
i.setType(“image/*”);
因为这两个方法都会清除对方的值,要指定完整的date必须这样写i.setDataAndType(Uri.parse(uri), “image/*”);

你可能感兴趣的:(Activity,action,Data,category,隐式启动)