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);
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories