大部分转载:
这个讲的很清楚。
http://blog.csdn.net/andie_guo/article/details/9271973
Intent filter 关于Action、Category属性详解---附带实例源码
如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter就是 用来注册 Activity 、 Service 和 Broadcast Receiver 具有能在某种数据上执行一个动作的能力。使用 Intent Filter ,应用程序组件告诉 Android ,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。(注意fliter可以加在四个组件里)
为了注册一个应用程序组件为 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> <span style="color:#ff0000">
- </span>
请求1:
- Intent intent = new Intent("myapp.action.test1");
- startActivity(intent);
- Intent intent = new Intent("myapp.action.test2");
- startActivity(intent);
(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
===
我写的请求视频播放软件的code:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(path + application.SECONDVIDEODIR
+ videoFileList.get(m_nClickListViewId) ) );
intent.putExtra("oneshot", 0); // play only one time
intent.putExtra("configchange", 0);
intent.setDataAndType(uri, "video/*");
startActivity(intent);
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请求都可以通过上述<intent-filter>的类别测试。
请求1:
- Intent intent = new Intent("myapp.action.test1");
- intent.addCategory("cate1");
- startActivity(intent);
- 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);
category的一些讲解:
注意上图最后一句话:
<category android:name="android.intent.category.LAUNCHER" />
所以这句话的意思就是,如果应用程序启动,那就会发送这个LAUNCHER类别的intent,然后注册这个类别的intent-fliter的组件会启动。
实例部分源码:
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>
- 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
===
intent-fliter里还有其它data属性(或者叫标签),可以看看其它资料。比如data标签