您的位置:首页 > 移动开发 > Android开发

IntentFilter匹配规则讲解

2016-06-14 17:16 417 查看

前言

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息