- 浏览: 106744 次
- 性别:
文章分类
最新评论
-
cagegao:
太好了~~~!
Android中的Intent -
faiinlove:
veenter 写道和没说一样!这文章说的很好啊,你要看到这文 ...
Android SDK安装 -
veenter:
和没说一样!这文章
Android SDK安装 -
ktmhate:
thanks for share..
Android中的Intent -
ktmhate:
为了回访。竟然跑去填测试。他比你早三年
Android应用的构成
例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够 跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity),为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系 统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描 述,执行相应的操作。
一、抽象描述要描述什么
在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述(确实很抽象)。我们先来看看这里的抽象描述,到底描述了什么。
首先,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作:
- MAIN_ACTION
- VIEW_ACTION
- EDIT_ACTION
- PICK_ACTION
- GET_CONTENT_ACTION
- DIAL_ACTION
- CALL_ACTION
- SENDTO_ACTION
- ANSWER_ACTION
- INSERT_ACTION
- DELETE_ACTION
- RUN_ACTION
- LOGIN_ACTION
- CLEAR_CREDENTIALS_ACTION
- SYNC_ACTION
- PICK_ACTIVITY_ACTION
- WEB_SEARCH_ACTION
其次,是执行动作要操作的数据(data),Android中 采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。
以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:
- VIEW_ACTION content://contacts/1 -- 显示标识符为"1"的联系人的详细信息
- EDIT_ACTION content://contacts/1 -- 编辑标识符为"1"的联系人的详细信息
- VIEW_ACTION content://contacts/ -- 显示所有联系人的列表
- PICK_ACTION content://contacts/ -- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人
另外,除了action和data这两个重要属性外,还有一些附加属性:
- category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这 些动作可以在同一块数据上执行。
- type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
- component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
- extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
总之,action、data/type、category和extras 一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种语言。应用也可以提供自己的Activity来处理已经存在的这样的“短语”,从而改变这些“短语”的行 为。
二、Android如何解析Intent
在应用中,我们可以以两种形式来使用Intent:
- 直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
- 间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
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如何定义及如何被解析。这个应用可以让用户浏览便笺列表、查看每一个便笺的详细信息。
- <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>
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的便笺的标题。
发表评论
-
如何让Activity以全屏方式显示
2007-12-03 10:59 5471有时候,我们想让应用以全屏的方式显示,而不仅仅 ... -
为Activity屏幕的标题添加图标
2007-11-30 14:47 7282我们可以在AndroidManifest.xm ... -
Android屏幕元素层次结构
2007-11-22 14:56 13702对于一个Android手机应用来说,一个好看 ... -
Android开发工具使用之adb
2007-11-21 17:02 16344adb(Android Debug Bridge)是An ... -
Gphone参与者的五种心态
2007-11-22 12:11 1951IPhone推出之后,业界一直在盼望GPhone、 ... -
在Android应用中定制菜单
2007-11-20 17:59 15331通过Android提 ... -
Android应用的生命周期
2007-11-20 17:57 3436<文档翻译> ... -
李开复解读Gphone Android和手机联盟
2007-11-20 17:55 2344来看看李开复怎么看Android的吧。 以下 ... -
Android应用的构成
2007-11-20 17:50 7778<文档翻译> 对于一个Android应用程序来说 ... -
将UI从代码中解放出来
2007-11-20 17:47 2014做软件开发 ... -
Hello World
2007-11-20 17:46 1902一如既往,还是从Hello, ... -
Android SDK安装
2007-11-20 17:43 19074下载好Android SDK后,开始安装, Android S ...
相关推荐
### Android中Intent的Uri使用详解 #### 概述 在Android开发中,`Intent`是进行组件间通信的重要工具之一,它可以启动一个Activity、BroadcastReceiver或Service,也可以用来向服务发送数据请求。其中,`Intent`的...
当我们需要在Intent中传递复杂对象时,有两种主要的方法:Serializable和Parcelable。这两种方式都可以实现对象的序列化,但它们在性能和效率上存在差异。 **Serializable接口** Serializable接口是Java提供的一个...
在Android开发中,Intent是一个非常核心的组件,它充当了应用程序不同组件之间的信使,用于在组件间传递消息和启动动作。这篇博客“Android中Intent的使用”将深入讲解Intent的基本概念、类型以及如何在实际开发中...
- `putExtra()`: 用于添加额外的数据到Intent中,例如字符串、整数、布尔值等,以便在目标组件中通过`getExtras()`获取。 - `setFlags()`: 设置Intent的标志,影响Intent的处理方式,如FLAG_ACTIVITY_NEW_TASK用于...
在Android应用开发中,Intent是连接应用程序组件之间通信的关键机制,它用于启动其他组件或传递数据。本篇文章将深入探讨Intent的基本概念、类型、构造方法以及如何在Android中有效地使用Intent。 Intent是一种意图...
在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者传递数据。本示例将深入探讨Intent的基本用法和常见应用场景。 首先,Intent分为显式Intent和隐式...
在Android应用开发中,Intent和ProgressBar是两个非常关键的组件。Intent主要用于启动活动(Activity)、服务(Service)或广播接收器(BroadcastReceiver),而ProgressBar则是显示进度或加载状态的控件,为用户...
6. Parcelable接口:对于更复杂的数据结构,如自定义对象,你可以使对象实现Parcelable接口,这样可以在Intent中直接传递对象。实现Parcelable接口涉及多个步骤,包括创建描述符类、实现writeToParcel()和...
Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable...
在Android开发中,Intent是一个至关重要的组件,它用于在组件之间传递消息,启动或激活服务。Intent不仅可以用来启动活动(Activity),还可以启动服务(Service)或者广播接收器(BroadcastReceiver)。在本文中,...
- 使用`putExtra()`方法可以在Intent中添加额外的数据,如`intent.putExtra("key", "value");` - 数据类型包括基本类型(int、String等)、Parcelable(自定义对象、Bitmap等)和Serializable(复杂对象)。 3. *...
在Android开发中,Intent是一种非常重要的组件,它用于在应用程序之间传递消息,启动或激活服务。本篇将详细解析如何使用Intent启动各种类型的应用。 1. **浏览网页与谷歌搜索**: - 使用`Intent.ACTION_VIEW`启动...
通过调用`putExtra()`方法可以将数据附加到Intent中,例如: ```java i.putExtra("result", result); ``` 这里的`result`是你要传递的变量名,`result`变量的值就是传递的数据。 5. 启动Intent 一旦Intent准备好了...
在Android应用程序开发中,Intent是连接各个组件(如Activity、Service等)的关键桥梁,主要用于启动和关闭Activity。Intent不仅能够启动一个新的Activity,还能在Activity之间传递数据,实现应用内部或应用间的交互...
在Android开发中,Intent是一个非常重要的概念,它用于在组件之间传递消息,是Android系统启动服务、启动或跳转Activity的主要手段。本篇文章将详细解释Intent的基本使用以及如何通过Intent实现在两个Activities之间...
本文实例讲述了android中intent传递list或者对象的方法。分享给大家供大家参考。具体实现方法如下: 方法一: 如果单纯的传递List<String> 或者List的话 就可以直接使用 代码如下: 代码如下:intent....
- `putExtra(String name, boolean value)`等:将各种类型的数据添加到Intent中,如布尔值、字符串、数组等。 - `setAction(String action)`:设置Intent的动作。 - `setData(Uri uri)`:设置数据Uri。 - `...