概述
前言
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);
如有错误欢迎指出来,一起学习。
最后
以上就是淡定网络为你收集整理的IntentFilter匹配规则讲解的全部内容,希望文章能够帮你解决IntentFilter匹配规则讲解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复