[Android] IntentFilter-->Action、Category属性详解

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

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

一、动做测试:app

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

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

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

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

规则b.若是Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就经过了这条<intent-filter>的动做测试。spa

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

如下几种Intent请求均可以经过上述<intent-filter>的动做测试。
code

请求1:xml

Intent intent = new Intent("myapp.action.test1");
startActivity(intent);

请求2:utf-8

Intent intent = new Intent("myapp.action.test2");
startActivity(intent);

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

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

二、类别测试

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

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

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

请求1:

    Intent intent = new Intent("myapp.action.test1");
    intent.addCategory("cate1");
    startActivity(intent);

请求2:

    Intent intent = new Intent("myapp.action.test1");
    intent.addCategory("cate2");
    startActivity(intent);

请求3:

        Intent intent = new Intent("myapp.action.test1");
        intent.addCategory("cate1");
        intent.addCategory("cate2");
        startActivity(intent);

实例部分源码:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.x210.intentfilters"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="9" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.x210.intentfilters.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">   
            <intent-filter>
                <action android:name="myapp.action.test1" />
                <action android:name="myapp.action.test2" />
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>
        </activity>
        <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">   
            <intent-filter>  
                <action android:name="myapp.action.test1" />
                <category android:name="cate1"/>
                <category android:name="cate2"/>
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java(核心代码)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    
        actionbutton = (Button) findViewById(R.id.ActionButton);
        categorybutton = (Button) findViewById(R.id.CategoryButton);
        actionbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("myapp.action.test1");
                startActivity(intent);
            }
        });
        categorybutton.setOnClickListener(new View.OnClickListener() {        
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("myapp.action.test1");
                intent.addCategory("cate1");
                intent.addCategory("cate2");
                startActivity(intent);
            }
        });
    }
相关文章
相关标签/搜索