Activity的隐式启动需要Intent能够匹配 目标组件的IntentFilter中 所设置的过滤信息,不匹配将无法启动目标组件Activity;
一个Activity中可以设置多组IntentFilter,而每组IntentFilter中的过滤信息有action ,category,data;
看图说明:
1.一个Intent只要能匹配上面任意一组intent-filter,即可成功启动对应的Activity,上面1,2任何一组都可以;
2.要匹配任意一组intent-filter,就要同时匹配action类别,category类别,data类别,才算是完全匹配;
3.使用隐式调用要求IntentFilter必须定义action和category,data可以没有;
其中 category android:name="android.intent.category.DEFAULT"是一定要设置的。
因为启动的时候Intent会默认加上这个category,否则的话无法启动。
拿下面这个intent-filter为例子介绍
要匹配这个隐式Intent,可以如下来写,当然只是随便一种,
Intent intent = new Intent();
intent.setAction("com.app.webview");
String url = "http://192.168.1.1:8080//123456789";
intent.setDataAndType(Uri.parse(url), "image/*");
startActivity(intent);
action的匹配规则
要求:Intent中的action必须和intent-filter中的某一个action相同
Intent i = new Intent();
//两个action随便写一个就可以
i.setAction("com.app.webview");//这是一个action
//i.setAction("android.intent.action.VIEW");//另外一个action
category的匹配规则
要求:Intent中如果含有category,那么所有的category都必须和intent-filter中的某个category相同
它和action的不同是Intent要求必须有一个action且和< intentfiliter />中的某一个action相同,这是Activity的隐式调用所必须的
Intent中category可以没有category,因为它启动的时候默认会追加一个android.intent.category.DEFAULT,所以这也就要求intent-filiter中必须有android.intent.category.DEFAULT
// 可以一个不写,可任意写一个,或两个都写
i.addCategory("12345566789");
i.addCategory("nbenjnbpeui");
data的匹配规则
要求:intent-filter如果定义了data,那么Intent中的data必须和Itent-filter中某一个data相同
data是有两部分组成,mimeType和URI,mimeType是指媒体类型
data的语法示例:
URI的结构:
< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPattern>]
在匹配URI的时候要求前面scheme , host , port 必须一模一样,
而对于path ,pathPrefix ,pathPattern只要有一个正确就能够完全匹配整个URI了
比如:String url =“http://192.168.1.1:8080//eyishion/article/details/”;就可以完整匹配上面的data
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参数才是有意义的。
先说一下 android:path="/eyishion/article/details/"这里面的/是写法要求必须要加上的,以/开头,不然会有报错提示;
要匹配它必须一字不差,一模一样的,举个例子
匹配这个data,必须这样写
String url = “http://192.168.1.1:8080/eyishion/article/details/”;
它里面使用正则表达式匹配路径,比如 .*
. 表示任意字符
*表示字符出现0次或者多次,比如下面这个
可以如下写法
String url = “http://192.168.1.1:8080/我随便表示”;
哈哈就是这样,我只是为了演示学习,
先说一下android:pathPrefix="/123456789"这里面的/是写法要求必须要加上的,以/开头,不然会有报错提示;
如果要匹配它的话,前面前缀必须是123456789,后面跟随意字符,举个例子
要匹配这个data可以这样写,前面123456789必须有,后面接什么无所谓;
String url = “http://192.168.1.1:8080/1234567890”;
String url = “http://192.168.1.1:8080/123456789098000”;
String url = “http://192.168.1.1:8080/1234567890***********”;
上面那个data要匹配的话,可以这样来写;
最后说一下如何制定完整的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/*");