[置顶] Intent filter 关于Action、Category属性详解---附带实例源码

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

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

1、动作测试:

        <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>匹配

        <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>的动作测试。

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

请求1:

Intent intent = new Intent("myapp.action.test1");
startActivity(intent);
请求2:

Intent intent = new Intent("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、类别测试

  <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);
			}
		});
	}
特别提醒实例源码(免费): http://download.csdn.net/detail/a13429921973/5720603

你可能感兴趣的:(android,action,intent,intent,category,filters)