`
huakewoniu
  • 浏览: 47649 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Intent详解

阅读更多

在应用中,我们可以以两种形式来使用Intent

直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

对于直接IntentAndroid不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此IntentActivityIntentReceiverService

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intentactiontypecategory这三个属性来进行判断的,判断方法如下:

如果Intent指明定了action,则目标组件的IntentFilteraction列表中就必须包含有这个action,否则不能匹配;

如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent scheme必须出现在目标组件的scheme列表中。

如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

三、应用例子

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

xml 代码

复制内容到剪贴板

代码:
<manifest
xmlns:android="
http://schemas.android.com/apk/res/android"
package="com.google.android.notepad">
<application
android:icon="@drawable/app_notes"
android:label="@string/app_name">
<provider
class="NotePadProvider"
android:authorities="com.google.provider.NotePad"
/>
<activity
class=".NotesList"
android:label="@string/title_notes_list">
<intent-filter>
<action
android:value="android.intent.action.MAIN"
/>
<category
android:value="android.intent.category.LAUNCHER"
/>
</intent-filter>
<intent-filter>
<action
android:value="android.intent.action.VIEW"
/>
<action
android:value="android.intent.action.EDIT"
/>
<action
android:value="android.intent.action.PICK"
/>
<category
android:value="android.intent.category.DEFAULT"
/>
<type
android:value="vnd.android.cursor.dir/vnd.google.note"
/>
</intent-filter>
<intent-filter>
<action
android:value="android.intent.action.GET_CONTENT"
/>
<category
android:value="android.intent.category.DEFAULT"
/>
<type
android:value="vnd.android.cursor.item/vnd.google.note"
/>
</intent-filter>
</activity>


<activity
class=".NoteEditor"
android:label="@string/title_note">
<intent-filter
android:label="@string/resolve_edit">
<action
android:value="android.intent.action.VIEW"
/>
<action
android:value="android.intent.action.EDIT"
/>
<category
android:value="android.intent.category.DEFAULT"
/>
<type
android:value="vnd.android.cursor.item/vnd.google.note"
/>
</intent-filter>
<intent-filter>
<action
android:value="android.intent.action.INSERT"
/>
<category
android:value="android.intent.category.DEFAULT"
/>
<type
android:value="vnd.android.cursor.dir/vnd.google.note"
/>
</intent-filter>
</activity>


<activity
class=".TitleEditor"
android:label="@string/title_edit_title"
android:theme="@android:style/Theme.Dialog">
<intent-filter
android:label="@string/resolve_title">
<action
android:value="com.google.android.notepad.action.EDIT_TITLE"
/>
<category
android:value="android.intent.category.DEFAULT"
/>
<category
android:value="android.intent.category.ALTERNATIVE"
/>
<category
android:value="android.intent.category.SELECTED_ALTERNATIVE"
/>
<type
android:value="vnd.android.cursor.item/vnd.google.note"
/>
</intent-filter>
</activity>


</application>

</manifest>      

例子中的第一个Activitycom.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),或者让用户选择一个便笺并返回给调用者(action android.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时,允许用户查看和修改一个便签(action android.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中,拥有一个私有的action com.google.android.notepad.action.EDIT_TITLE,表明允许用户编辑便笺的标题。

和前面的viewedit 动作一样,调用这个Intent 的时候,也必须指定具体的便笺(typevnd.android.cursor.item/vnd.google.note)。不同的是,这里显示和编辑的只是便笺数据中的标题。

除了支持缺省类别(android.intent.category.DEFAULT),标题编辑器还支持另外两个标准类别: android.intent.category.ALTERNATIVE
android.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的便笺的标题。

                                       (转载 来源不详)

分享到:
评论

相关推荐

    Android-Intent详解最新版本

    本文档主要讲述的是Android_Intent详解;Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。比如说调用startActivity()来启动一个activity,或者由...

    Android学习总结-Intent详解.doc

    Intent在Android开发中扮演着至关重要的角色,它是四大组件(Activity、Service、BroadcastReceiver和ContentProvider)间通信的关键。Intent不仅用于应用间的交互,也可以在同一个应用内的不同组件之间传递信息。...

    Android_Intent详解

    ### Android Intent详解 #### 一、Intent的作用与概念 **Intent** 在Android开发中扮演着极为重要的角色,它是实现Android应用程序内部以及不同应用程序之间通信的关键工具。简而言之,Intent可以被视为一种消息...

    android_Intent详解

    ### Android Intent 详解 #### 一、Intent 的作用 `Intent` 在 Android 开发中扮演着极其重要的角色,它是用于启动或与应用组件(如 Activity、Service 或 BroadcastReceiver)交互的一种方式。简而言之,`Intent`...

    android-页面跳转-Activity&Intent详解,Bundle类介绍说明.doc

    Android 页面跳转和 Intent 详解,Bundle 类介绍说明 Android 页面跳转是移动应用程序中的一种基本交互方式,通过 Intent 和 Activity 两个组件来实现。Intent 是 Android 中的一个核心组件,用于在不同的 Activity...

    androidintent详解参照.pdf

    Android Intent 详解 Android Intent 是 Android 应用程序中的一种机制,用于在应用程序组件之间进行通讯和交互。 Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此 Intent ...

    ZX-Android-Intent详解

    ### ZX-Android-Intent详解 #### 一、Intent的基本概念及作用 在Android开发中,`Intent`扮演着至关重要的角色。它是一个用于描述要执行的动作的抽象对象,主要用于协助完成Android应用程序内部不同组件间的通信。...

    Activity&Intent详解.pptx

    android Activity& android Intent详解, 入门级别

    《intent详解(二)》源码

    Intent详解(二)源码分析 Intent在Android系统中扮演着至关重要的角色,它是应用程序间通信(IPC,Inter-Process Communication)的主要手段。Intent不仅用于启动活动(Activity)、服务(Service),还可以用来...

    Android-Intent详解.doc编程资料

    Android-Intent详解.doc

    Android Activity与Intent详解及示例代码

    Intent intent = new Intent(this, TargetActivity.class); startActivity(intent); ``` 如果需要传递数据,可以使用`putExtra()`方法: ```java intent.putExtra("key", "value"); ``` 然后在目标Activity的`...

    Android 隐式Intent的实例详解

    “Android 隐式Intent 的实例详解” Android 隐式Intent 是一种特殊的 Intent,用于在不明确设置激活对象的前提下寻找最匹配的组件。它的核心思想是通过在 AndroidManifest.xml 文件中设置意图过滤器,来指定 ...

    本人整理的android开发文档,第5章 Intent

    ### Android开发文档:Intent详解 #### 一、Intent概述 在Android开发中,`Intent`是一种核心机制,用于实现应用程序内部或跨应用组件间的通信。它不仅能够启动新的活动(Activity),还能广播消息,使应用组件能...

    Android经典设计源码-Intent_TabHostSample.rar

    一、Intent详解 Intent在Android中起着桥梁的作用,它连接了应用程序的不同组件,如Activity、Service、BroadcastReceiver等。Intent分为显式Intent和隐式Intent两种类型。显式Intent通过指定组件的完整类名来启动...

    Android Intent传递数据大小限制详解

    在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能...

    android intent 实例详解

    ### Android Intent 机制详解 #### 一、Intent 的基本概念 **Intent** 是 Android 四大应用组件(Activity、Service、Broadcast Receiver 和 Content Provider)之间通信的重要桥梁。它是一种消息对象,用来描述一...

Global site tag (gtag.js) - Google Analytics