- 浏览: 46585 次
- 性别:
- 来自: 西安
最新评论
在应用中,我们可以以两种形式来使用Intent:
直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个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>
例子中的第一个Activity是com.google.android.notepad.NotesList,它是应用的主入口,提供了三个功能,分别由三个 intent-filter进行描述:
1、第一个是进入便笺应用的顶级入口(action为android.app.action.MAIN)。类型为android.app.category.LAUNCHER表明这个Activity将在Launcher中列出。
2、第二个是,当type为vnd.android.cursor.dir/vnd.google.note(保存便笺记录的目录)时,可以查看可用的便笺(action为android.app.action.VIEW),或者让用户选择一个便笺并返回给调用者(action为 android.app.action.PICK)。
3、第三个是,当type为vnd.android.cursor.item/vnd.google.note时,返回给调用者一个用户选择的便笺(action为android.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 }:和上面的action为pick的Intent类似,不同的是这个Intent允许调用者(在这里指要调用NotesList的某个 Activity)指定它们需要返回的数据类型,系统会根据这个数据类型查找合适的 Activity(在这里系统会找到NotesList这个Activity),供用户选择便笺。
第二个Activity是com.google.android.notepad.NoteEditor,它为用户显示一条便笺,并且允许用户修改这个便笺。
它定义了两个intent-filter,所以具有两个功能。
第一个功能是,当数据类型为 vnd.android.cursor.item/vnd.google.note时,允许用户查看和修改一个便签(action为 android.app.action.VIEW和android.app.action.EDIT)。
第二个功能是,当数据类型为 vnd.android.cursor.dir/vnd.google.note,为调用者显示一个新建便笺的界面,并将新建的便笺插入到便笺列表中(action为android.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将会返回给调用者。
最后一个Activity是com.google.android.notepad.TitleEditor,它允许用户编辑便笺的标题。
它可以被实现为一个应用可以直接调用(在Intent中明确设置component属性)的类,不过这里我们将为你提供一个在现有的数据上发布可选操作的方法。
在这个 Activity的唯一的intent-filter中,拥有一个私有的action: com.google.android.notepad.action.EDIT_TITLE,表明允许用户编辑便笺的标题。
和前面的view和edit 动作一样,调用这个Intent 的时候,也必须指定具体的便笺(type为vnd.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 and Intent Filter (转)
2011-03-10 22:47 1430Android Intent and Intent ... -
Intent间传送数据一般有两种常用方法
2011-01-24 14:50 1275Intent间传送数据一般有两种常用的办法: 1.extra ... -
android RelativeLayout 详解
2011-01-01 09:46 1563<?xml version="1.0" ... -
How to Use Android Downloads Provider
2010-12-20 21:41 1311本文转载自 http://blog.lytsing.or ... -
android 开发中的一些小知识点
2010-12-17 09:49 9651 关于onPause(): onPause ... -
content provider 深入解析
2010-12-15 22:04 1073Content providers are on ... -
Service的高级应用
2010-12-12 20:48 1325下面是android Service的高级应用的一个例子,主要 ... -
TabActivity
2010-12-12 19:09 1736下面是一个使用android tabactivity 的例子 ... -
android 测试初探(android test)
2010-12-07 15:00 7986android Testing and Instrumenta ... -
Localization of android
2010-12-05 21:51 0android 会在不同地域的不同机器上运行。为了是应用能够 ... -
android高效编程之使用本地变量
2010-12-05 14:26 950hava a look at the following co ... -
在不同的Activity中传递对象的方法
2010-12-02 10:20 1982下面我们将要实现的功 ... -
Cursor与Adapter
2010-11-21 08:34 1206来自: http://hi.baidu.com/lfcaoli ... -
Working with Context Menus
2010-11-15 23:36 830... -
Handler的理解
2010-11-14 20:58 803A Handler allows you to sen ... -
android开发问题解决日志
2010-11-14 18:33 18501.、android中R文件消失的处理方式 ... -
android 中对SDCard 的操作
2010-11-11 14:14 1601对于像视频这样的大文件,我们可以把它存放在SDCard。 SD ... -
ViewAnimation
2010-11-05 12:46 1014view animation 的实现 Understandi ... -
android高效的编写高效代码
2010-10-17 19:13 730本文来源于: 从此学习网 原文: http://www.con ... -
scale animation
2010-10-11 23:29 1588Scale animation: You use this t ...
相关推荐
Android-Intent详解
Android_Intent详解
android Activity& android Intent详解, 入门级别
android_Intent详解, 关于android中intent的使用有关的东东
androidintent详解参照.pdf
Android-Intent详解.doc
ZX-Android-Intent详解 让你更快了解
博客《intent详解(二)》对应的源码合集,博客地址:http://blog.csdn.net/harvic880925/article/details/38406421
代码示例说明Android页面跳转,并且叙述了Activity和Intent的用法原理, 透视分析Bundle类的使用介绍
Intents and Intent Filters 三种应用程序基本组件——activity, service和broadcast receiver——是使用称为intent的消息来激活的。Intent消息传递是一种组件间运行时绑定的机制. intent是Intent对象, 它包含了...
本文主要讲解Android Activity与Intent的知识,这里整理了相关资料并附有示例代码,有兴趣的小伙伴可以参考下
主要介绍了Android 隐式Intent的实例详解的相关资料,隐式意图就是在不明确设置激活对象的前提下寻找最匹配的组件,需要的朋友可以参考下
在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能...
Android+Intent机制实例详解 Android+Intent 大家不得不看啊!
Android_Intent和Intent_Filter详解
Android+Intent机制实例详解.rar,详细的介绍了,android中的intent知识,可以下载下来看看哟
Android-Intent使用方法详解 配合(http://blog.csdn.net/daiyibo123/article/details/51227160)博客查看。使用Android stdio编写。
android intent 应用实例详解,很详细的文档