Intent Filter是android里非常有特色的一个概念。他的用户体验和windows下的文件管理器的弹出菜单里的“打开方式”非常相似。在windows中,当用户选择了打开方式菜单后,系统让用户选择应用来打开所选择的文件。而在android中的文件已经被uri资源代替了。

Intent Filter在android中的应用非常普遍,尤其在资源共享中。例如,当用户选择了一个图片,选择了共享,我们常常会发现一个选择列表。这个选择列表是动态生成的,不是一成不变的。假如你新安装了facebook应用,那么facebook就会出现在这个列表里面。从这个例子可以发现,intent filter的设计使得android系统显得更加灵活了。

要实现一个Intent Filter, 我们要在AndroidManifest.xml中加入必要的设置,以通知系统某个activity都能够处理什么类型的URI资源,然后要在activity的onCreate中加入必要的代码以处理系统传递过来rui资源。

一个Service、 Activity 或者 Brodcast Reciever 的Intent Filter , 的事件过滤器, 我们用着大家都很了然的说法来描述之吧, 实际上描述了拥有这些过滤器组建在系统中所具有能力。

Filter 的创建都是通过 manifest.xml 文件, 但是对于 Broadcast Reciever 用 Context.registerReceiver() 来创建。Filter 可以包含三种类型的过滤条件 <action> <category> <data>

一个Intent 是否能够通过一个过滤器到达对应的处理器取决于, Intent 所包含的 所有Categroy 是够都在 过滤器中的catergory 列表里出现。 换句话说, 没有 catergory字段的Inteng 可以通过任何过滤器, 而一个过滤器, 必须至少要有一个可以通过的限定,Category 或者 Action。 对于Action 也一样, 能够通过Filter 的Itent的 Action 必须被列与 Category中。同样, 没有Action 的Intent 也可以通过所有的Filter。

对于 <data> 过滤条件稍微复杂点, 但是总的原则还是, 只有Intent 能够通过 Filter, 那么Intent 中的信息,必须出现在Filter中。 <data> 需要指定 scheme://host:port/path , 条件顺序的优先级随着范围缩小而降低,相当于,看作目录,在子目录下匹配。 比如, Filter指定了 scheme, 那么所有具有这个 scheme 的 Intent 都能通过,这个Filter, 类似的通配符的情况也是允许的。

这里翻译文档中的四个例子情况:

a.如果没有定义URI 和数据类型, 则,该Intent只能通过没有定义URI和 数据类型的 过滤器。

b.只定义了URI的 Intent 只能通过只定义了 URI 的过滤器。

c.只定义了 数据类型的 Intent 也只能通过只定义了 数据类型的过滤器。

d. 如果一个Intent同事定义了URI和 数据类型, 或者数据类型可以由URI推定, 则只有具备了对应的数据类型,或者 content: 或者 file: 类型,并且没有定义URI的过滤器。(这种情况, 你自己代码一下就明白了, 在写下去,我也不鸟鸟了。)

如果通向Activities 的Intent 引起了多个响应, 就会出现需要用户指定的提示, 或者是异常。

差不多就是这样的情况了, android 的这种机制非常适合移动设备之间的应用相互调用, 以便在更大的粒度上达成复用。很强大。

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/MainActivity.java

        
  1. 代码
  2. packagecom.amaker.ch06.app;
  3. importcom.amaker.ch06.app.R;
  4. importandroid.app.Activity;
  5. importandroid.content.Intent;
  6. importandroid.net.Uri;
  7. importandroid.os.Bundle;
  8. importandroid.view.View;
  9. importandroid.view.View.OnClickListener;
  10. importandroid.widget.Button;
  11. /**
  12. *
  13. *IntentFilter测试
  14. */
  15. publicclassMainActivityextendsActivity{
  16. //声明Button
  17. privateButtonbtn;
  18. privatestaticfinalStringACTION1="com.amaker.ch06.app.TEST_ACTION1";
  19. privatestaticfinalStringACTION2="com.amaker.ch06.app.TEST_ACTION2";
  20. privatestaticfinalStringACTION3="com.amaker.ch06.app.TEST_ACTION3";
  21. privatestaticfinalStringCATEGORY1="com.amaker.ch06.app.CATEGORY1";
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. //设置内容布局
  26. setContentView(R.layout.main);
  27. //实例化按钮
  28. btn=(Button)findViewById(R.id.Button01);
  29. Stringa=Intent.ACTION_VIEW;
  30. //添加单击监听器
  31. btn.setOnClickListener(newOnClickListener(){
  32. @Override
  33. publicvoidonClick(Viewview){
  34. Intentintent=newIntent();
  35. //intent.setAction(ACTION1);
  36. //Uridata=Uri.parse("content://com.amaker.ch07.app/abc");
  37. //intent.setData(data);
  38. intent.addCategory(CATEGORY1);
  39. intent.setAction("android.intent.action.VIEW");
  40. intent.setData(Uri.parse("http://www.google.com"));
  41. startActivity(intent);
  42. }
  43. });
  44. }
  45. }

/Chapter06_Intent_Filter/src/com/amaker/ch06/app/TestActivity.java

        
  1. 代码
  2. packagecom.amaker.ch06.app;
  3. importcom.amaker.ch06.app.R;
  4. importandroid.app.Activity;
  5. importandroid.os.Bundle;
  6. /**
  7. *测试IntentFilter
  8. */
  9. publicclassTestActivityextendsActivity{
  10. @Override
  11. publicvoidonCreate(BundlesavedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.main1);
  14. }
  15. }

/Chapter06_Intent_Filter/res/layout/main.xml

        
  1. 代码
  2. <?xmlversion="1.0"encoding="utf-8"?>
  3. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <Button
  9. android:text="测试IntentFilter"
  10. android:id="@+id/Button01"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"></Button>
  13. </LinearLayout>

/Chapter06_Intent_Filter/res/layout/main1.xml

        
  1. 代码
  2. <?xmlversion="1.0"encoding="utf-8"?>
  3. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <TextView
  9. android:text="测试IntentFilter"
  10. android:id="@+id/TextView01"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"></TextView>
  13. </LinearLayout>

/Chapter06_Intent_Filter/AndroidManifest.xml

        
  1. 代码
  2. <?xmlversion="1.0"encoding="utf-8"?>
  3. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  4. package="com.amaker.ch06.app"
  5. android:versionCode="1"
  6. android:versionName="1.0">
  7. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  8. <activityandroid:name=".MainActivity"
  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="TestActivity">
  16. <intent-filter>
  17. <actionandroid:name="com.amaker.ch06.app.TEST_ACTION1"/>
  18. <actionandroid:name="com.amaker.ch06.app.TEST_ACTION2"/>
  19. <actionandroid:name="com.amaker.ch06.app.TEST_ACTION3"/>
  20. <actionandroid:name="android.intent.action.VIEW"/>
  21. <dataandroid:scheme="content"android:path="com.amaker.ch07.app/abc"/>
  22. <dataandroid:scheme="http"android:path="www.google.com"/>
  23. <categoryandroid:name="android.intent.category.DEFAULT"/>
  24. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  25. <categoryandroid:name="com.amaker.ch07.app.CATEGORY1"/>
  26. </intent-filter>
  27. </activity>
  28. </application>
  29. <uses-sdkandroid:minSdkVersion="3"/>
  30. </manifest>

更多相关文章

  1. Android中RatingBar的自定义效果
  2. 自定义PopupWindow的实现
  3. 一起Talk Android吧(第一百四十七回:Android自定义View之Layout四)
  4. Android进阶自定义控件之滑动开关
  5. Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
  6. android之控件自定义(seekBar)
  7. 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
  8. Android 实现自定义控件效果1

随机推荐

  1. Android开发者应该深入学习的10个开源应
  2. 部署应用程序到Android手机
  3. Android入门教程(三)之----------> 导入
  4. Android Studio 从安装到配置使用
  5. Android Studio常用设置
  6. Android事件处理方法总结-Handler消息处
  7. Android中数据存储——SharedPreferences
  8. 选择一款2K-3K的Android机器,犹豫中
  9. 在Android中加载并使用opencv的方法
  10. 鍦ㄧ數鑴戜笂鐢ㄩ紶鏍囧拰閿洏鎺у埗an