[转帖]Android系列教程之十一:Intents and Intent Filters(二)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3171 | 回复: 0   主题: [转帖]Android系列教程之十一:Intents and Intent Filters(二)        下一篇 
jie.liang
注册用户
等级:少校
经验:1003
发帖:77
精华:0
注册:2013-10-11
状态:离线
发送短消息息给jie.liang 加好友    发送短消息息给jie.liang 发消息
发表于: IP:您无权察看 2013-10-18 9:21:25 | [全部帖] [楼主帖] 楼主

接上节继续。。版权所有:飞雪无情,转载请注明出处:http://flysnow.iteye.com/blog/965527

Android开发技术交流群86686524    120059404

Android系列教程目录:

  1. Android教程之一:Window下搭建Android开发环境


  2. Android教程之二:Linux下搭建Android开发环境


  3. Android教程之三:第一个Android应用,HelloWorld


  4. Android系列教程之四:Android项目的目录结构


  5. Android系列教程之五:Activity的生命周期


  6. Android系列教程之六:TextView小组件的使用--附带超链接和跑马灯效果


  7. Android系列教程之七:EditText使用详解-包含很多教程上看不到的功能演示


  8. Android系列教程之八:ListView组件的使用


  9. Android系列教程之九:GridView组件的使用


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



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 IntentsTestList extends 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" },new int[] {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.  * 返回ListView需要的数据 
    42.  * @return ListView需要的数据 
    43.  */ 
    44.  private List<Map<String,Object>> getData() { 
    45.        List<Map<String,Object>> data=new ArrayList<Map<String,Object>>(); 
    46.        addItem(data, "1个Category检测-Activity", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),true); 
    47.        addItem(data, "1个Category检测-Broadcast", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN),false); 
    48.        addItem(data, "2个Category检测-Activity", new Intent(ACTION_VIEW).addCategory(CATEGORY_MAN).addCategory(CATEGORY_SHOP),true); 
    49.        return data; 
    50.  } 
    51.  /** 
    52.  * 给ListView添加数据 
    53.  * @param data 存储数据的List 
    54.  * @param name 要显示的Title 
    55.  * @param intent 单击某一项时要启动的Activity 
    56.  * @param isActivity 启动的是否是Activity,true是,false为广播 
    57.  */ 
    58.  private void addItem(List<Map<String,Object>> data, String name, Intent intent,boolean isActivity) { 
    59.        Map<String, Object> temp = new HashMap<String, Object>(); 
    60.        temp.put("title", name); 
    61.        temp.put("intent", intent); 
    62.        temp.put("isActivity", isActivity); 
    63.        data.add(temp); 
    64.  } 
    65.  private IntentFilter filter=new IntentFilter(ACTION_VIEW); 
    66.  


以上代码主要是一个ListView,列出了三个测试项,1个Category的测试和2个Category的测试,注册了一个广播.
  • 为了测试新建了2个Activity,分别是CategoryActivity和Category2Activity,代码如下:

    Java代码

    1. /**  
    2.  * @author 飞雪无情  
    3.  * @since 2011-3-14  
    4.  */ 
    5. public class CategoryActivity extends 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 Category2Activity extends 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.    

     很简单只是一段文字的说明
  • AndroidManiftest.xml修改如下:

    Xml代码

    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <manifestxmlns: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. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
    8. <activityandroid:name=".IntentsTestList"
    9. android:label="@string/app_name">
    10. <intent-filter>
    11. <actionandroid:name="android.intent.action.MAIN"/>
    12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
    13. </intent-filter>
    14. </activity>
    15. <activityandroid:name=".CategoryActivity"android:label="1个Category检测">
    16. <intent-filter>
    17. <actionandroid:name="com.flysnow.intent.ACTION_VIEW"></action>
    18. <categoryandroid:name="android.intent.category.DEFAULT"></category>
    19. <categoryandroid:name="com.flysnow.intent.CATEGORY_MAN"></category>
    20. </intent-filter>
    21. </activity>
    22. <activityandroid:name=".Category2Activity"android:label="2个Category检测">
    23. <intent-filter>
    24. <actionandroid:name="com.flysnow.intent.ACTION_VIEW"></action>
    25. <categoryandroid:name="android.intent.category.DEFAULT"></category>
    26. <categoryandroid:name="com.flysnow.intent.CATEGORY_MAN"></category>
    27. <categoryandroid:name="com.flysnow.intent.CATEGORY_SHOP"></category>
    28. </intent-filter>
    29. </activity>
    30. </application>
    31. </manifest>

    为CategoryActivity添加了2个Category,一个是默认的(隐式Intent必须),一个是自定义的。而相应的Category2Activity则有三个Category。
  • 我们运行测试,效果图如下:
    北京联动北方科技有限公司
     当点击“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)    操作        顶端 
    总帖数
    1
    每页帖数
    101/1页1
    返回列表
    发新帖子
    请输入验证码: 点击刷新验证码
    您需要登录后才可以回帖 登录 | 注册
    技术讨论