Intent filter 关于Action、Category属性详解 & 程序启动如何决定哪个是第一个启动的组件。

时间:2021-10-27 16:31:26


大部分转载:

这个讲的很清楚。

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、动作测试:

[java] view plaincopy
  1. <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  2.     <intent-filter>  
  3.         <action android:name="myapp.action.test1" />  
  4.         <category android:name="android.intent.category.DEFAULT" />    
  5.     </intent-filter>  
  6. </activity>  

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

[java] view plaincopy
  1. <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  2.     <intent-filter>    
  3.         <category android:name="cate1"/>  
  4.         <category android:name="cate2"/>  
  5.         <category android:name="android.intent.category.DEFAULT" />    
  6.     </intent-filter>  
  7. </activity>   

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

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

[java] view plaincopy
  1.         <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  2.             <intent-filter>  
  3.                  <action android:name="myapp.action.test1" />  
  4.                  <action android:name="myapp.action.test2" />  
  5.                  <action android:name="myapp.action.test3" />  
  6.                 <category android:name="android.intent.category.DEFAULT" />    
  7.             </intent-filter>  
  8.         </activity> <span style="color:#ff0000">  
  9. </span>  
以下几种Intent请求都可以通过上述<intent-filter>的动作测试。

请求1:

[java] view plaincopy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. startActivity(intent);  
请求2:

[java] view plaincopy
  1. Intent intent = new Intent("myapp.action.test2");  
  2. startActivity(intent);  
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。

(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、类别测试

[java] view plaincopy
  1. <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  2.           <intent-filter>    
  3.               <action android:name="myapp.action.test1" />  
  4.               <category android:name="cate1"/>  
  5.               <category android:name="cate2"/>  
  6.               <category android:name="android.intent.category.DEFAULT" />    
  7.           </intent-filter>  
  8.       </activity>  
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。

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

请求1:

[java] view plaincopy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate1");  
  3. startActivity(intent);  
请求2:
[java] view plaincopy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate2");  
  3. startActivity(intent);  

请求3:

[java] view plaincopy
  1. Intent intent = new Intent("myapp.action.test1");  
  2. intent.addCategory("cate1");  
  3. intent.addCategory("cate2");  
  4. startActivity(intent);   

category的一些讲解:

Intent filter 关于Action、Category属性详解 & 程序启动如何决定哪个是第一个启动的组件。

Intent filter 关于Action、Category属性详解 & 程序启动如何决定哪个是第一个启动的组件。


注意上图最后一句话:

<category android:name="android.intent.category.LAUNCHER" />

所以这句话的意思就是,如果应用程序启动,那就会发送这个LAUNCHER类别的intent,然后注册这个类别的intent-fliter的组件会启动。


实例部分源码:

AndroidManifest.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.x210.intentfilters"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="9"  
  9.         android:targetSdkVersion="9" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="com.x210.intentfilters.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.                 <category android:name="android.intent.category.LAUNCHER" />  
  22.             </intent-filter>  
  23.         </activity>  
  24.         <activity android:name="com.x210.intentfilters.OneActivity" android:label="oneActivity">     
  25.             <intent-filter>  
  26.                 <action android:name="myapp.action.test1" />  
  27.                 <action android:name="myapp.action.test2" />  
  28.                 <category android:name="android.intent.category.DEFAULT" />    
  29.             </intent-filter>  
  30.         </activity>  
  31.         <activity android:name="com.x210.intentfilters.OtherActivity" android:label="otherActivity">     
  32.             <intent-filter>    
  33.                 <action android:name="myapp.action.test1" />  
  34.                 <category android:name="cate1"/>  
  35.                 <category android:name="cate2"/>  
  36.                 <category android:name="android.intent.category.DEFAULT" />    
  37.             </intent-filter>  
  38.         </activity>  
  39.     </application>  
  40.   
  41. </manifest>  
MainActivity.java(核心代码) [java] view plaincopy
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.main);    
  4.         actionbutton = (Button) findViewById(R.id.ActionButton);  
  5.         categorybutton = (Button) findViewById(R.id.CategoryButton);  
  6.         actionbutton.setOnClickListener(new View.OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 Intent intent = new Intent("myapp.action.test1");  
  10.                 startActivity(intent);  
  11.             }  
  12.         });  
  13.         categorybutton.setOnClickListener(new View.OnClickListener() {        
  14.             @Override  
  15.             public void onClick(View v) {  
  16.                 Intent intent = new Intent("myapp.action.test1");  
  17.                 intent.addCategory("cate1");  
  18.                 intent.addCategory("cate2");  
  19.                 startActivity(intent);  
  20.             }  
  21.         });  
  22.     }  

特别提醒实例源码(免费):http://download.csdn.net/detail/a13429921973/5720603


===

intent-fliter里还有其它data属性(或者叫标签),可以看看其它资料。比如data标签