Android系列教程之十一:Intents and Intent Filters(二)

来源:互联网 发布:电火花线切割编程 编辑:程序博客网 时间:2024/06/07 12:45

Category(类别)检测

类别在<intent-filter>中是通过<category>标记定义的,Category和Action一样,他们的名字都是一个字符串定义,但是我们在代码中可以使用对应的类别常量,在xml文件定义中只能使用定义好的字符串。Android的Intent类中提供了很多内置的类别定义,一中类别代表一个意思,可以参考说明使用。。比如android.intent.category.LAUNCHER标表示你的应用会展示在启动列表页面,经常和android.intent.action.MAIN搭配使用

下面通过一个例子来说明Category的检测,项目名为Intents,应用名为Intents and Filters,运行在Android2.2版本上.主启动Activity为IntentsTestList。

  1. IntentsTestList代码如下:
    Java代码 复制代码 收藏代码
    1. /**
    2. * Intents测试列表类
    3. * @author 飞雪无情
    4. * @since 2011-3-14
    5. */ 
    6. public class IntentsTestListextends ListActivity { 
    7.     private String ACTION_VIEW="com.flysnow.intent.ACTION_VIEW"
    8.     private String CATEGORY_MAN="com.flysnow.intent.CATEGORY_MAN"
    9.     private String CATEGORY_SHOP="com.flysnow.intent.CATEGORY_SHOP"
    10.     /** Called when the activity is first created. */ 
    11.     @Override 
    12.     public void onCreate(Bundle savedInstanceState) { 
    13.         super.onCreate(savedInstanceState); 
    14.       //定义ListAdapter 
    15.         setListAdapter(new SimpleAdapter(this, getData(), 
    16.                 android.R.layout.simple_list_item_1, new String[] { "title" },newint[] {android.R.id.text1})); 
    17.         getListView().setTextFilterEnabled(true); 
    18.          
    19.         filter.addCategory(CATEGORY_MAN); 
    20.         //注册一个广播 
    21.         super.registerReceiver(new BroadcastReceiver() { 
    22.              
    23.             @Override 
    24.             public void onReceive(Context context, Intent intent) { 
    25.                 Toast.makeText(context, "该Broadcast的Intent Filter设置了Category和Action", Toast.LENGTH_SHORT).show(); 
    26.             } 
    27.         },filter); 
    28.     } 
    29.     @Override 
    30.     protected void onListItemClick(ListView l, View v,int position, long id) { 
    31.         Intent intent=(Intent)getData().get(position).get("intent"); 
    32.         Boolean isActivity=(Boolean)getData().get(position).get("isActivity"); 
    33.         if(isActivity){ 
    34.             startActivity(intent); 
    35.         }else
    36.             sendBroadcast(intent); 
    37.         } 
    38.          
    39.     } 
    40.  
    41.     /**
    42.      * 返回ListView需要的数据
    43.      * @return ListView需要的数据
    44.      */ 
    45.     private List<Map<String,Object>> getData() { 
    46.         List<Map<String,Object>> data=new ArrayList<Map<String,Object>>(); 
    47.         addItem(data, "1个Category检测-Activity",new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),true); 
    48.         addItem(data, "1个Category检测-Broadcast",new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),false); 
    49.         addItem(data, "2个Category检测-Activity",new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN).addCategory(CATEGORY_SHOP),true); 
    50.         return data; 
    51.     } 
    52.     /**
    53.      * 给ListView添加数据
    54.      * @param data 存储数据的List
    55.      * @param name 要显示的Title
    56.      * @param intent 单击某一项时要启动的Activity
    57.      * @param isActivity 启动的是否是Activity,true是,false为广播
    58.      */ 
    59.     private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) { 
    60.         Map<String, Object> temp = new HashMap<String, Object>(); 
    61.         temp.put("title", name); 
    62.         temp.put("intent", intent); 
    63.         temp.put("isActivity", isActivity); 
    64.         data.add(temp); 
    65.     } 
    66.     private IntentFilter filter=new IntentFilter(ACTION_VIEW); 
    67.      
    以上代码主要是一个ListView,列出了三个测试项,1个Category的测试和2个Category的测试,注册了一个广播.
  2. 为了测试新建了2个Activity,分别是CategoryActivity和Category2Activity,代码如下:
    Java代码 复制代码 收藏代码
    1. /**
    2. * @author 飞雪无情
    3. * @since 2011-3-14
    4. */ 
    5. public class CategoryActivityextends Activity { 
    6.  
    7.     @Override 
    8.     protected void onCreate(Bundle savedInstanceState) { 
    9.         super.onCreate(savedInstanceState); 
    10.         TextView text=new TextView(this); 
    11.         text.setText("该Activity的Intent Filter值设置了Action和1个Category,不包含android.intent.category.DEFAULT"); 
    12.         setContentView(text); 
    13.     } 
    14.      
    Java代码 复制代码 收藏代码
    1. /**
    2. * @author 飞雪无情
    3. * @since 2011-3-14
    4. */ 
    5. public class Category2Activityextends Activity { 
    6.  
    7.     @Override 
    8.     protected void onCreate(Bundle savedInstanceState) { 
    9.         super.onCreate(savedInstanceState); 
    10.         TextView text=new TextView(this); 
    11.         text.setText("该Activity的Intent Filter值设置了Action和2个Category,不包含android.intent.category.DEFAULT"); 
    12.         setContentView(text); 
    13.     } 
    14.      
    很简单只是一段文字的说明
  3. AndroidManiftest.xml修改如下:
    Xml代码 复制代码 收藏代码
    1. <?xml version="1.0"encoding="utf-8"?> 
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    3.       package="com.flysnow.intent" 
    4.       android:versionCode="1" 
    5.       android:versionName="1.0"> 
    6.     <uses-sdkandroid:minSdkVersion="8"/> 
    7.  
    8.     <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> 
    9.         <activityandroid:name=".IntentsTestList" 
    10.                   android:label="@string/app_name"> 
    11.             <intent-filter> 
    12.                 <actionandroid:name="android.intent.action.MAIN"/> 
    13.                 <categoryandroid:name="android.intent.category.LAUNCHER"/> 
    14.             </intent-filter> 
    15.         </activity> 
    16.         <activityandroid:name=".CategoryActivity"android:label="1个Category检测"> 
    17.             <intent-filter> 
    18.                 <actionandroid:name="com.flysnow.intent.ACTION_VIEW"></action> 
    19.                 <categoryandroid:name="android.intent.category.DEFAULT"></category> 
    20.                 <categoryandroid:name="com.flysnow.intent.CATEGORY_MAN"></category> 
    21.             </intent-filter> 
    22.         </activity> 
    23.          <activityandroid:name=".Category2Activity"android:label="2个Category检测"> 
    24.             <intent-filter> 
    25.                 <actionandroid:name="com.flysnow.intent.ACTION_VIEW"></action> 
    26.                 <categoryandroid:name="android.intent.category.DEFAULT"></category> 
    27.                 <categoryandroid:name="com.flysnow.intent.CATEGORY_MAN"></category> 
    28.                 <categoryandroid:name="com.flysnow.intent.CATEGORY_SHOP"></category> 
    29.             </intent-filter> 
    30.         </activity> 
    31.     </application> 
    32. </manifest> 
    为CategoryActivity添加了2个Category,一个是默认的(隐式Intent必须),一个是自定义的。而相应的Category2Activity则有三个Category。
  4. 我们运行测试,效果图如下:

    当点击“1个Category检测-Activity”的时候,会弹出

    这是,因为我们的Intent定义了一个Category,这个Category在CategoryActivity和Category2Activity里都有,都能匹配上,所以就会弹出这两个Activity供我们选择,而当我们单击《2个Category检测-Activity》的时候就会直接打开Category2Activity,这是因为这个选项里的Intent有2个Category,只有Category2Activity才能匹配上。。。通过例子我们可以总结到:Intent中所包含的所有Category必须在一个组件的intent-filter中有定义,一个都不能少,否则不能通过检测。。但是intent-filter的可以有额外的Category.再次提醒:Android对所有传递给Context.startActivity()的隐式intent至少包含"android.intent.category.DEFAULT"
0 0