Android Intent隐式调用之intent-filter匹配规则

   有Android开发经验的几乎都知道使用Intent启动新的Activity,显式调用很简单,所以大部分也是使用显式调用,但是更深层次的开发的避不开使用隐式调用。显式调用都很熟悉,这里就重点介绍一下隐式调用。如果两者共存的话,以显式调用为主。此外隐式调用需要Intent能够匹配目标组件的IntentFilter中设置的过滤信息,如果不匹配将无法启动目标ActivityIntentFilter中的过滤信息包括actioncategorydataactioncategory系统都有预定义一些,我们也可以进行自定义。过滤规则往往声明在AndroidMeniFest.xml中的activity中,下面是一个实例:

<activity

......

>

<intent-filter>

     <action android:name=”com.example.c”>

     <action android:name=”com.example.d”>

     <category android:name=”com.example.c”>

     <category android:name=”com.example.c”>

     <category android:name=”android.intent.category.DEDAULT”>

     <data android:mineType=”text/plain”>

</intent-filter>

</activity>

   从示例中我们可以看出,一个过滤列表中actioncategorydata可以有多个,而且一个Activity可以有多组intent-filter,一个Intent只要能匹配任何一组intent-filter即可启动对应的Activity

   下面介绍一下匹配规则:

(1) action的匹配规则

         要求Intent中必须有一个action能够和过滤规则中的其中一个action相同即可匹配成功。同时action区分大小写。如果Intent没有制定action则匹配失败。

(2) category的匹配规则

   和action不同,如果Intent中含有category,要求所有的category必须在过滤规则中都存在才能匹配成功。如果Intent中没有categoey也可以匹配成功,这是和action的区别。

   如果在Intent中设置category可以用intent.addcategory(“......”)

   为什么不设置categoey也可以匹配成功呢,因为系统调用startActivity或者startActivityForResult的时候会默认加上android.intent.category.DEDAULT这个category。为了Activity能够接受隐式调用,我们必须在intent-filter中添加android.intent.category.DEDAULT这个category

(3) data的匹配规则

         data的过滤规则和action是类似的,Intent中必须至少指定一个过滤规则中定义的datadata的结构比较复杂,包括两部分,mimeTypeURImimeType指媒体类型,比如image/jpge等。URI包含的数据就多了,shamehostportpathpathPattern等都是他的组成部分。相信有一定计算机开发经验的已经相当熟悉了。

   下面讲一下这两部分是如何匹配的:

比如下面的过滤规则:

<intent-filter>

      <data android:mimeType=”image/*” />

      .......

<intent-filter>

         这种规则指定了媒体类型是所有类型的图片,URI虽然没有指明,但系统却有默认值:http或者file。也就是说对没有指明的URIIntent中的URI部分的shame必须为http或者file才能匹配,比如下面的就能匹配:

intent.setDataAndType(Uri.prase(“file://abc”),”image/png”);

   如果要为intent指定完整的data,必须要用setDataAndType,里面的DataURITypemimeType。不能先调用setData再调用setType,否则两个方法会彼此清楚对方的值。我们看一下系统的源代码:

public Intent setData(Uri data){

     mData=data;

     mType=null;

     return this;

}

          另外一点,Intent-filter的匹配规则对于ServiceBroadcastReceiver也是同样的道理。但Service还是尽量采用显式调用来启动服务。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值