Android中的Intent详细讲解

    |     2015年6月19日   |   Activity活动   |     0 条评论   |    1687

Android 应用主要由四种组件构成(可参考「Android 应用的构成」)。组件彼此独立,要互相调用、协调工作,通讯主要靠 Intent 协助完成。


一、Intent 在组件之间当媒人

QQ╜╪═╝20150619155924

Intent 负责描述一次操作的动作、涉及的数据、附加数据。系统根据这段描述找到对应组件,把 Intent 传过去并完成调用。它是调用者与被调用者之间的中介,用来解耦。

例如联系人应用:列表屏(listActivity)点某个联系人后要进详情屏(detailActivity)。listActivity 构造一个 Intent,告诉系统要做「查看」,对象是「某联系人」,再 startActivity(Intent intent)。系统到 Manifest 里找能满足该 Intent 的 Activity,启动 detailActivity,并把 Intent 传进去,后者按描述执行。


二、抽象描述要描述什么

文档里 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

也可以按应用需要自定义动作,并提供相应 Activity 来处理。

其次是动作要操作的数据(data),用指向数据的 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(邮件客户端可用来请用户选联系人)

除 action、data 外还有附加属性:

  • category(类别):动作的附加信息。LAUNCHER_CATEGORY 表示接收者应作为顶级应用出现在 Launcher;ALTERNATIVE_CATEGORY 表示这是同一块数据上一系列可选动作之一。
  • type(数据类型):显式指定 MIME。一般能从 data 推断,设置后则强制用指定类型。
  • component(组件):目标组件类名。通常系统按 action、data/type、category 查找;一旦指定 component,就直接用它,不再查找。指定后其它属性都可选。
  • extras(附加信息):其它附加信息的集合。例如「发送电子邮件」可以把标题、正文放进 extras 传给发送组件。

总之,action、data/type、category 和 extras 一起形成一种语言,让系统理解「查看某联系人详情」这类短语。新应用可以加入新的 action / data / category 扩展这种语言,也可以提供自己的 Activity 处理已有短语,从而改变行为。

属性 描述什么 例子
action 要执行的动作 VIEW_ACTION / EDIT_ACTION / 自定义
data 操作对象的 URI content://contacts/1
type 显式 MIME 不设则从 data 推断
category 动作附加分类 LAUNCHER_CATEGORY
component 直接指定目标类 setClass / setComponent
extras 附加键值 邮件标题、正文

三、Android 如何解析 Intent

应用里可以用两种形式:

  • 直接 Intent:指定了 component(setComponent(ComponentName) 或 setClass(Context, Class))。目标类明确,系统不用解析。
  • 间接 Intent:没有指定 component。必须包含足够信息,系统才能在所有可用组件里找出匹配者。

Android 要解析的是间接 Intent,把它映射到能处理它的 Activity、IntentReceiver 或 Service。解析主要靠 Manifest 里注册的 IntentFilter:用 action、type、category 判断。

  • Intent 指明了 action,则目标 Filter 的 action 列表必须包含它,否则不匹配。
  • Intent 没提供 type,系统从 data 得到数据类型。和 action 一样,目标数据类型列表必须包含该 type。
  • data 不是 content: 类型的 URI,且 Intent 也没明确 type,则按 scheme(如 http:、mailto:)匹配,scheme 必须出现在目标列表里。
  • Intent 指定了一个或多个 category,这些类别必须全部出现在组件的类别列表中。例如同时有 LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,目标至少要包含这两个。

四、便笺例子在做什么

Android SDK 里的便笺例子可以对照:浏览便笺列表、查看每一条的详细信息——列表到详情,正是用 Intent 把「查看某条数据」这句话交给系统去找对应 Activity。

一句话总结:Intent 用 action + data/type + category + extras 描述一次操作;指定了 component 就是直接跳转,没指定就靠 Manifest 里的 IntentFilter 做匹配。

转载请注明来源:Android中的Intent详细讲解
本文链接地址:https://ai.zhousir.top/?p=799
回复 取消