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

Activity的隐式启动的简介

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,否则的话无法启动。

IntentFilter这三种类别的匹配规则

拿下面这个intent-filter为例子介绍


   <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:host="192.168.1.1"
            android:mimeType="image/*"
            android:path="/eyishion/article/details/"
            android:pathPattern=".*"
            android:pathPrefix="/123456789"
            android:port="8080"
            android:scheme="http" />
    </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的语法示例:

	<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>]
在匹配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
      android:host="192.168.1.1"
      android:mimeType="image/*"
      android:path="/eyishion/article/details/"
      android:port="8080"
      android:scheme="http" />

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

pathPattern:表示完整的路径信息

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

  <data
      android:host="192.168.1.1"
      android:mimeType="image/*"
      android:pathPattern=".*"
      android:port="8080"
      android:scheme="http" />

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

pathPrefix:表示路径的前缀信息

先说一下android:pathPrefix="/123456789"这里面的/是写法要求必须要加上的,以/开头,不然会有报错提示;
如果要匹配它的话,前面前缀必须是123456789,后面跟随意字符,举个例子

   <data
       android:host="192.168.1.1"
       android:mimeType="image/*"
       android:pathPrefix="/123456789"
       android:port="8080"
       android:scheme="http" />

要匹配这个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/*");
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值