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

Activity的隐式启动的简介

Activity的隐式启动需要Intent能够匹配 目标组件的IntentFilter中 所设置的过滤信息,不匹配将无法启动目标组件Activity;
一个Activity中可以设置多组IntentFilter,而每组IntentFilter中的过滤信息有action ,category,data;
Activity隐式启动时候IntentFilter的匹配规则_第1张图片
看图说明:
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,否则的话无法启动。

IntentFilter这三种类别的匹配规则

拿下面这个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是有两部分组成,mimeTypeURI,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参数才是有意义的。

path:表示完整的路径信息

先说一下 android:path="/eyishion/article/details/"这里面的/是写法要求必须要加上的,以/开头,不然会有报错提示;
要匹配它必须一字不差,一模一样的,举个例子

  

匹配这个data,必须这样写
String url = “http://192.168.1.1:8080/eyishion/article/details/”;

pathPattern:表示完整的路径信息

它里面使用正则表达式匹配路径,比如 .*
. 表示任意字符
*表示字符出现0次或者多次,比如下面这个

  

可以如下写法
String url = “http://192.168.1.1:8080/我随便表示”;
哈哈就是这样,我只是为了演示学习,

pathPrefix:表示路径的前缀信息

先说一下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要匹配的话,可以这样来写;

setDataAndType

最后说一下如何制定完整的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隐式启动时候IntentFilter的匹配规则)