Android——IntentFilter匹配规则

我们都知道,intent分成两种:显式和隐式,显式需要制调用activity的包名和类名,而隐式是通过过滤规则来确定的。

在manifest.xml文件里我们可以给需要的Activity加上过滤的匹配规则,主要有这几个方面

<intent-filter>  
   <action android:name=".."/>
   <!-- 可以有若干个action -->

   <category android:name="android.intent.category.DEFAULT"/>
   <!-- 同样可以有若干个category 但一个activity想要被匹配,必须有上面这一个category,在下面会解释原因 -->

  <data android:scheme="string"
        android:host="string"
        android:port="string"
        android:path="string"
        android:mimeType="string"
        />
  <!--  data 只能有一个但可以分开写,比如 -->
  <!-- 
       <data android:scheme="string"/>
       <data android:host="string"/>
       ...
    --> 
</intent-filter>

<!-- 同一个activity下面可以有多个intent_filter,列如
<intent-filter> </intent-filter>
<intent-filter> </intent-filter>
...
<intent-filter> </intent-filter>
-->

1.首先分析intent-filter 的匹配原则:
一个activity只要它下面的一个intent-filter匹配成功就代表该activity匹配成功

2.分析intent-filter中action 的匹配
在intent里面我们可以通过intent.setAction(“”)的方式设置一个仅且最多一个action,在上面介绍的样例代码中我们可以看到一个intent-filter中可以有多个action,只需要intent-filter中的一个action和intent中指定的action相匹配则匹配成功。

3.category的匹配
intent-filter中也可以有多个category,而intent中也可以用intent.addCategory()的方式指定多个category,那么category匹配成功的条件是:intent中所指定的category条目,intent-filter中必须都有(也可以多)才算匹配成功比如,如果intent中指定了category有三条(“1”,“2”,“3”),那么在activity的intent-filter里面必须包含, ,…等等
要特别注意的是:我们在调用startActivity()或者startActivityForResult()启动时,会默认加上一条category属性,即android.intent.category.DEFAULT.所以一个activity如果想要被隐式调用就必须在intent-filter中加上这条category,不然就匹配不上。

data的匹配
data由两部分组成:URI和mimeType,mimeType指媒体类型,比如:image/png,URI的结构如下:
://:/[path]
scheme:URI的模式,data中scheme未指定则其他项都无效,URI无效
host:主机名,host未指定则其他项都无效,URI无效
port:端口,只有当scheme和host都指定才有效
path:路径

data的匹配规则大致可以这么理解:intent-filter中data包括的项,intent中也必须全部都有才算匹配成功
举几个例子:
例子一:

<intent-filter>
 <action android:name="abc"/>
 <data android:mimeType="image/png"/>
</intent-filter>

//在启动时
Intent intent=new Intent();
intent.setAction("abc");
intent.setType("image/png");//intent-filter只有mimeType所以只需要指定mimeType就好

例子二:

<intent-filter>
 <action android:name="abc"/>
 <data android:mimeType="image/png" android:scheme="http" android:host="www.xx.com" />
</intent-filter>

//在启动时
Intent intent=new Intent();
intent.setAction("abc");
intent.setType("image/png");//intent-filter有mimeType要指定mimeType
intent.setData(Uri.parse("http://www.xx.com"));//这样写逻辑上能匹配,但是是错误的,原因解释如下:
intent.setDataAndType(Uri.parse("http://www.xx.com"),"image/png);//这样写才是对的
/*
intent.setData()和intent.setType()会相互清除对方
public Intent setData(Uri data){
  mData=data;
  mType=null;
  return this;
}

public Intent setType(String type){
   mType=type;
   mData=null;
   return this;
}
*/

注意在intent-filter中如果没有写出data 的scheme那么他是默认值的,默认值为content或者file
比如:

<intent-filter>
  <action android:name="abc"/>
  <data android:mimeType="image/png" />
</intent-filter>
//不能匹配的设置方法
intent.setDataAndType(Uri.parse("http://"),"image/png");


//成功匹配的设置方法
intent.setDataAndType(Uri.parse("content://"),"image/png");
//或者
intent.setDataAndType(Uri.parse("file://"),"image/png");

总的规则可以概括为:
action中选一个(intent中的action,intent-filter中有一个满足就好了)

category 和data是你有我有大家有(intent指定的category,intent-filter中必须全有才能成功匹配,intent-filter中为data设置的项,intent中必须都有并一致)

category还必须有android.intent.category.DEFAULT(intent-filter中必须有,因为startActivity时会默认为intent 加上DEAULT)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值