A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张伟南 中级黑马   /  2016-11-13 23:31  /  660 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Android SDK中的便笺例子来说明,Intent如何定义及如何被解析。这个应用可以让用户浏览便笺列表、查看每一个便笺的详细信息。

Manifest.xml
Xml代码 [url=]file:///C:\Users\ZHANGW~1\AppData\Local\Temp\ksohtml\wps9F3C.tmp.jpg[/url]
1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"   
2. package="com.google.android.notepad">   
3.     <application android:icon="@drawable/app_notes"   
4. android:label="@string/app_name">   
5.     <provider class="NotePadProvider"   
6. android:authorities="com.google.provider.NotePad" />   
7.     <activity class=".NotesList"="@string/title_notes_list">   
8.       <intent-filter>   
9.         <action android:value="android.intent.action.MAIN"/>   
10.         <category android:value="android.intent.category.LAUNCHER" />   
11.       </intent-filter>   
12.       <intent-filter>   
13.         <action android:value="android.intent.action.VIEW"/>   
14.         <action android:value="android.intent.action.EDIT"/>   
15.         <action android:value="android.intent.action.PICK"/>   
16.         <category android:value="android.intent.category.DEFAULT" />   
17.         <type android:value="vnd.android.cursor.dir/vnd.google.note" />   
18.       </intent-filter>   
19.       <intent-filter>   
20.         <action android:value="android.intent.action.GET_CONTENT" />   
21.         <category android:value="android.intent.category.DEFAULT" />   
22.         <type android:value="vnd.android.cursor.item/vnd.google.note" />   
23.       </intent-filter>   
24.     </activity>   
25.     <activity class=".NoteEditor"="@string/title_note">   
26.       <intent-filter android:label="@string/resolve_edit">   
27.         <action android:value="android.intent.action.VIEW"/>   
28.         <action android:value="android.intent.action.EDIT"/>   
29.         <category android:value="android.intent.category.DEFAULT" />   
30.         <type android:value="vnd.android.cursor.item/vnd.google.note" />   
31.       </intent-filter>   
32.       <intent-filter>   
33.         <action android:value="android.intent.action.INSERT"/>   
34.         <category android:value="android.intent.category.DEFAULT" />   
35.         <type android:value="vnd.android.cursor.dir/vnd.google.note" />   
36.       </intent-filter>   
37.     </activity>   
38.     <activity class=".TitleEditor"="@string/title_edit_title"   
39. android:theme="@android:style/Theme.Dialog">   
40.       <intent-filter android:label="@string/resolve_title">   
41.         <action android:value="com.google.android.notepad.action.EDIT_TITLE"/>   
42.         <category android:value="android.intent.category.DEFAULT" />   
43.         <category android:value="android.intent.category.ALTERNATIVE" />   
44.         <category android:value="android.intent.category.SELECTED_ALTERNATIVE"/>   
45.         <type android:value="vnd.android.cursor.item/vnd.google.note" />   
46.       </intent-filter>   
47.     </activity>   
48. </application>   
49. </manifest>  


例子中的第一个Activity com.google.android.notepad.NotesList,它是应用的主入口,提供了三个功能,分别由三个 intent-filter进行描述:
        1、第一个是进入便笺应用的顶级入口(actionandroid.app.action.MAIN)。类型为android.app.category.LAUNCHER表明这个Activity将在Launcher中列出。
        2、第二个是,当typevnd.android.cursor.dir/vnd.google.note(保存便笺记录的目录) 时,可以查看可用的便笺(actionandroid.app.action.VIEW),或者让用户选择一个便笺并返回给调用者(actionandroid.app.action.PICK)。
        3、第三个是,当typevnd.android.cursor.item/vnd.google.note时,返回给调用者一个用户选择的便笺(actionandroid.app.action.GET_CONTENT),而用户却不需要知道便笺从哪里读取的。 有了这些功能,下面的Intent就会被解析到NotesList这个activity

    * { action=android.app.action.MAIN }:与此Intent匹配的Activity,将会被当作进入应用的顶级入口。

    * { action=android.app.action.MAIN, category=android.app.category.LAUNCHER }:这是目前Launcher实际使用的 Intent,用于生成Launcher的顶级列表。

    * { action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes }:显示"content://com.google.provider.NotePad/notes"下的所有便笺的列表,使用者可以遍历列表,并且察看某便笺的详细信息。

    * { action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }:显示"content://com.google.provider.NotePad/notes"下的便笺列表,让用户可以在列表中选择一个,然后将选择的便笺的 URL返回给调用者。

    * { action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note }:和 上面的actionpickIntent类似,不同的是这个Intent允许调用者(在这里指要调用NotesList的某个Activity)指定 它们需要返回的数据类型,系统会根据这个数据类型查找合适的 Activity(在这里系统会找到NotesList这个Activity),供用户选择便笺。


        第二个Activitycom.google.android.notepad.NoteEditor,它为用户显示一条便笺,并且允许 用户修改这个便笺。它定义了两个intent-filter,所以具有两个功能。第一个功能是,当数据类型为 vnd.android.cursor.item/vnd.google.note时,允许用户查看和修改一个便签(actionandroid.app.action.VIEWandroid.app.action.EDIT)。第二个功能是,当数据类型为 vnd.android.cursor.dir/vnd.google.note,为调用者显示一个新建便笺的界面,并将新建的便笺插 入到便笺列表中(actionandroid.app.action.INSERT)。

      有了这两个功能,下面的Intent就会被解析到NoteEditor这个activity

    * { action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes/{ID} } :向用户显示标识为 ID的便笺。

    * { action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID} }:允许用户编辑标识为ID的便笺。

    * { action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes }:在“content://com.google.provider.NotePad/notes”这个便笺列表中创建一个新的空便笺,并允许用 户编辑这个便签。当用户保存这个便笺后,这个新便笺的URI将会返回给调用者。


        最后一个Activitycom.google.android.notepad.TitleEditor,它允许用户编辑便笺的标题。它可以被实现为 一个应用可以直接调用(在Intent中明确设置component属性)的类,不过这里我们将为你提供一个在现有的数据上发布可选操作的方法。在这个 Activity的唯一的intent-filter中,拥有一个私有的actioncom.google.android.notepad.action.EDIT_TITLE,表明允许用户编辑便笺的标题。和前面的viewedit 动作一样,调用这个Intent 的时候,也必须指定具体的便笺(typevnd.android.cursor.item/vnd.google.note)。不同的是,这里显示和编 辑的只是便笺数据中的标题。
      除了支持缺省类别(android.intent.category.DEFAULT),标题编辑器还支持另外两个标准类别: android.intent.category.ALTERNATIVEandroid.intent.category.SELECTED_ALTERNATIVE。实现了这两个类别之后,其它 Activity就可以调用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查询这个Activity提供的action,而不需要了解它的具体实现;或者调用addIntentOptions(int, int, ComponentName, Intent[], Intent, int, Menu.Item[])建立动态菜单。需要说明的是,在这个intent-filter中有一个明确的名称(通过android:label= "@string/resolve_title"指定),在用户浏览数据的时候,如果这个Activity是数据的一个可选操作,指定明确的名称可以为用 户提供一个更好控制界面。
      有了这个功能,下面的Intent就会被解析到TitleEditor这个Activity

    * { action=com.google.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID} }:显示并且允许用户编辑标识为ID的便笺的标题。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马