如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter就是 用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。

为了注册一个应用程序组件为 Intent 处理者,在组件的 manifest 节点添加一个 intent-filter 标签。在 Intent Filter 节点里使用下面的标签(关联属性),你能指定组件支持的动作、种类和数据。

1、动作测试:

<activityandroid:name="com.x210.intentfilters.OneActivity"android:label="oneActivity"><intent-filter><actionandroid:name="myapp.action.test1"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity>

规则a.一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配

<activityandroid:name="com.x210.intentfilters.OtherActivity"android:label="otherActivity"><intent-filter><categoryandroid:name="cate1"/><categoryandroid:name="cate2"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity>

以上<intent-filter>元素没有包含<action>标签,任何Intent请求都无法与该<intent-filter>匹配。

规则b.如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。

<activityandroid:name="com.x210.intentfilters.OneActivity"android:label="oneActivity"><intent-filter><actionandroid:name="myapp.action.test1"/><actionandroid:name="myapp.action.test2"/><actionandroid:name="myapp.action.test3"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity><spanstyle="color:#ff0000"></span>

以下几种Intent请求都可以通过上述<intent-filter>的动作测试。

请求1:

Intentintent=newIntent("myapp.action.test1");startActivity(intent);

请求2:

Intentintent=newIntent("myapp.action.test2");startActivity(intent);

如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。

(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

2、类别测试

<activityandroid:name="com.x210.intentfilters.OtherActivity"android:label="otherActivity"><intent-filter><actionandroid:name="myapp.action.test1"/><categoryandroid:name="cate1"/><categoryandroid:name="cate2"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity>

只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。

以下三种Intent请求都可以通过上述<intent-filter>的类别测试。

请求1:

Intentintent=newIntent("myapp.action.test1");intent.addCategory("cate1");startActivity(intent);

请求2:

Intentintent=newIntent("myapp.action.test1");intent.addCategory("cate2");startActivity(intent);

请求3:

Intentintent=newIntent("myapp.action.test1");intent.addCategory("cate1");intent.addCategory("cate2");startActivity(intent);

实例部分源码:

AndroidManifest.xml

<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.x210.intentfilters"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="9"android:targetSdkVersion="9"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name="com.x210.intentfilters.MainActivity"android:label="@string/app_name"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name="com.x210.intentfilters.OneActivity"android:label="oneActivity"><intent-filter><actionandroid:name="myapp.action.test1"/><actionandroid:name="myapp.action.test2"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity><activityandroid:name="com.x210.intentfilters.OtherActivity"android:label="otherActivity"><intent-filter><actionandroid:name="myapp.action.test1"/><categoryandroid:name="cate1"/><categoryandroid:name="cate2"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity></application></manifest>

MainActivity.java(核心代码)

protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);actionbutton=(Button)findViewById(R.id.ActionButton);categorybutton=(Button)findViewById(R.id.CategoryButton);actionbutton.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent("myapp.action.test1");startActivity(intent);}});categorybutton.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent("myapp.action.test1");intent.addCategory("cate1");intent.addCategory("cate2");startActivity(intent);}});}


更多相关文章

  1. Android(安卓)UI组件学习
  2. Android(安卓)Intent and Intent-filter SDK file
  3. 开始使用Android(安卓)Sutdio(二)配置Android(安卓)Studio
  4. 【支付宝】Android(安卓)支付宝支付 沙箱测试(交易状态错误ALI31
  5. 极光推送完整流程测试
  6. [Android]自定义组件示例:使用attrs.xml文件定制RadioButton
  7. 让你明白,Android常用组件四大天王
  8. 转:搭建Android(安卓)UI Testing自动化测试开发环境
  9. Android自动化测试,5个必备的测试框架

随机推荐

  1. HorizontalListView(包含setSelection功能
  2. android中的一些权限
  3. Android4.0模拟器“谷歌输入法已停止运行
  4. android 文件读写
  5. appium 调试问题--UiAutomator died whil
  6. Android备忘录,留着自用,高手勿笑:(三)XML
  7. Android中pendingIntent的详解
  8. Github-Client(ANDROID)开源之旅(二) ------
  9. Android(安卓)studio 引入导入 arr依赖
  10. 详解 Linux 环境下防毒软件 ClamAV