IntentFilter匹配规则讲解

前言


Android启动activity有两种,显式调用跟隐式调用。显式调用大家平时用得比较多,调用时需要明确的指定被启动对象的组件信息,类名,隐式调用则不需要明确指定组件信息。

下面用代码来解释什么是显式启动。
A:显式启动

Intent intent=new Intent(MainActivity.this, SecondActivity.class); 
startActivity(intent);

B:隐式启动
隐式启动不同之处在于我们并不需要像Intent(MainActivity.this, SecondActivity.class)这样传参数然后再Start另一个Activity.我们需要在intent添加过滤器intentfilter。

<activity
	android:name="com.test.SecondActivity"
	android:label="@string/title_activity_main" >
	<intent-filter>
		<action android:name="com.test.info"/>
		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
</activity>

这样,我们需要在启动另一个Activity的时候只需要如下方法就可以:

Intent intent=new Intent("com.test.info"); 
startActivity(intent);

隐式意图调用


由于显式意图启动大家用得比较多,这边主要讲解隐式意图调用。
过滤器IntentFilter中的过滤信息有action,category,data三种,下面是一个示例。

 <activity android:name=".Main3Activity">
            <intent-filter>
                <action android:name="focus.teach.myapplication.movie" />
                <action android:name="focus.teach.myapplication.sss" />
                <category android:name="focus.teach.myapplication.category.test"/>
                <category android:name="focus.teach.myapplication.category.d"/>
                <data android:mimeType="image/jpeg"/>
            </intent-filter>
            <intent-filter>
                <action android:name="focus.teach.myapplication.movie1" />
                <action android:name="focus.teach.myapplication.sss1" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" android:scheme="http"/>
                <data android:mimeType="image/jpeg" android:scheme="http"/>
            </intent-filter>
        </activity>

1.多个intent-filter的匹配规则

  • 一个activity可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter中的action,category,data即可成功启动activity。

2.action的匹配规则

  • 一个intent对象只能指定一个action,而一条< intent-filter>元素至少应该包含一个<
    action>,否则任何Intent请求都不能和该< intent-filter>匹配;

  • 一个intent对象的action和intent-filter中的任何一个action相同,不需要全部相同,即可匹配成功,另外action是区分大小写的;

  • 如果intent对象不指定action且< intent-filter>的action列表不为空,则匹配失败;

  • 如果< intent-filter>中action列表为空,则该activity无法被启动。

3.category的匹配规则

  • 一个intent对象可以指定多个category,但至少会有一个,也是默认的一个 category,“android.intent.category.DEFAULT”;

  • 如果一个intent定义了多个category,则每个category都要跟<
    intent-filter>中其中一个category相同;

  • intent可以没有category,这时候,也可以匹配成功。因为在startActivity或者startActivityForResult的时候,系统会默认跟intent加上“android.intent.category.DEFAULT”这个category,所以任何<
    intent-filter>中必须要有“android.intent.category.DEFAULT”这个category。

4 data的匹配规则

  • < intent-filter>没有定义data的时候,intent对象也可以不定义data,而一条< intent-filter>也可以定义多条data,匹配规则跟action一致;
    下面为URI的结构:< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPattern>]
  • 如果没有定义URI,由于URI有默认值,为content和file,所以没有指定URI的,但是intent中的URI部分的scheme必须为content或者file。
  <data android:mimeType="text/plain"/>

则intent必须如下所示:

intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
  • 为intent设置完整的data,必须用setDataAndType方法,不能分开用setData跟setType,因为上述两个方法会彼此覆盖。

如果< intent-filter>有多组完整data,则跟action一样,intent中主要匹配其中一个即可成功。


最上面的intent-filiter用如下的intent则可以启动成功。

Intent intent = new Intent("focus.teach.myapplication.movie");
intent.addCategory("focus.teach.myapplication.category.test");
intent.setDataAndType(Uri.parse("file://abc"),"image/jpeg");
startActivity(intent);

如有错误欢迎指出来,一起学习。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值