分享

Android Intent和Intent Filter详解(四)

 wanwanstudy 2012-02-11
Using intent matching 使用intent匹配

        intent和intent filter相匹配, 不仅为了寻找并启动一个目标组件, 也是为了寻找设备上组件的信息. 例如, android系统启动了应用程序启动器, 该程序位于屏幕的顶层, 显示了用户可以启动的程序, 这是通过查找设备上所有的action为"android.intent.action.MAIN" ,category为"android.intent.category.LAUNCHER"的intent filter所在的activity实现的. 然后它显示了这些activity的图标和标题. 类似的, 它通过寻找 "android.intent.category.HOME"的filter来定位主屏幕程序.

       应用程序可以用相同的方式来使用intent匹配. PackageManager 有一组query...()方法来寻找接受某个特定intent的所有组件, 还有一系列resolve...()方法来决定响应一个intent的最佳组件. 例如, queryIntentActivities()返回一个activity列表, 这些activity可以执行传入的intent. 类似的还有queryIntentServices()和queryIntentBroadcastReceivers().

        Note Pad Example 例子:记事本

        记事本示例程序让用户可以浏览一个笔记列表, 查看, 编辑, 删除和增加笔记. 这一节关注该程序定义的intent filter.

        在其manifest文件中, 记事本程序定义了三个activity, 每个有至少一个intent filter. 它还定义了一个content provider来管理笔记数据. manifest 文件如下:

java代码:
  1. <manifest xmlns:android="http://schemas./apk/res/android"
  2. package="eoe.demo">
  3. <application android:icon="@drawable/app_notes"
  4. android:label="@string/app_name" >

  5. <provider android:name="NotePadProvider"
  6. android:authorities="com.google.provider.NotePad" />

  7. <activity android:name="NotesList" android:label="@string/title_notes_list">
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN" />
  10. <category android:name="android.intent.category.LAUNCHER" />
  11. </intent-filter>
  12. <intent-filter>
  13. <action android:name="android.intent.action.VIEW" />
  14. <action android:name="android.intent.action.EDIT" />
  15. <action android:name="android.intent.action.PICK" />
  16. <category android:name="android.intent.category.DEFAULT" />
  17. <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
  18. </intent-filter>
  19. <intent-filter>
  20. <action android:name="android.intent.action.GET_CONTENT" />
  21. <category android:name="android.intent.category.DEFAULT" />
  22. <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
  23. </intent-filter>
  24. </activity>

  25. <activity android:name="NoteEditor"
  26. android:theme="@android:style/Theme.Light"
  27. android:label="@string/title_note" >
  28. <intent-filter android:label="@string/resolve_edit">
  29. <action android:name="android.intent.action.VIEW" />
  30. <action android:name="android.intent.action.EDIT" />
  31. <action android:name="com.android.notepad.action.EDIT_NOTE" />
  32. <category android:name="android.intent.category.DEFAULT" />
  33. <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
  34. </intent-filter>
  35. <intent-filter>
  36. <action android:name="android.intent.action.INSERT" />
  37. <category android:name="android.intent.category.DEFAULT" />
  38. <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
  39. </intent-filter>
  40. </activity>

  41. <activity android:name="TitleEditor"
  42. android:label="@string/title_edit_title"
  43. android:theme="@android:style/Theme.Dialog">
  44. <intent-filter android:label="@string/resolve_title">
  45. <action android:name="com.android.notepad.action.EDIT_TITLE" />
  46. <category android:name="android.intent.category.DEFAULT" />
  47. <category android:name="android.intent.category.ALTERNATIVE" />
  48. <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
  49. <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
  50. </intent-filter>
  51. </activity>
  52. </application>
  53. </manifest>
复制代码

       第一个activity, NoteList, 和其它activity不同, 因为它操作一个笔记的目录(笔记列表), 而不是一个单独的笔记. 它一般作为该程序的初始界面. 它可以做以下三件事:

java代码:
  1. <intent-filter>
  2. <action android:name="android.intent.action.MAIN" />
  3. <category android:name="android.intent.category.LAUNCHER" />
  4. </intent-filter>
复制代码

        该filter声明了记事本应用程序的主入口. 标准的MAIN action是一个不需要任何其它信息(例如数据等)的程序入口, LAUNCHER category表示该入口应该在应用程序启动器中列出.

java代码:
  1. <intent-filter>
  2. <action android:name="android.intent.action.VIEW" />
  3. <action android:name="android.intent.action.EDIT" />
  4. <action android:name="android.intent.action.PICK" />
  5. <category android:name="android.intent.category.DEFAULT" />
  6. <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
  7. </intent-filter>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多