1:什么是 Intent

Intent是对被执行操作的抽象描述。调用 startActivity(Intent),可以启动 Activity;调用 broadcastIntent(Intent),可以把 Intent 发送给任何相关的 IntentReceiver 组件;调用 startService(Intent, Bundle) 以及 bindService(Intent, String, ServiceConnection, int) 可以让应用和后台服务进行通信。

Intent 提供了一个在不同应用的代码之间进行晚绑定 (late runtime binding) 的机制。它主要被用来启动 Activities,因此可以被看作是 Activities 之间的粘合剂。Intent 大体上是一个被动数据结构,该数据结构包括被执行动作的抽象描述。Intent 中的主要内容有:
ü         action -- 需要被执行的动作。比如 VIEW_ACTION, EDIT_ACTION, MAIN_ACTION 等。
ü         data -- 执行动作要操作的数据,在 Intent 里用指向数据记录的URI (ContentURI) 表示。比如联系人数据库中的一个联系人记录。
译注:被动数据结构:只能由外部线程或者进程改变的数据结构。与能够通过相关的线程或者进程执行内部操作从而产生外部行为的主动数据结构相对应。
下面是一些 action/data 对的例子:
ü         VIEW_ACTION content://contacts/1 -- 显示标识符为"1"的联系人的信息。
ü         EDIT_ACTION content://contacts/1 -- 编辑标识符为"1"的联系人的信息。
ü         VIEW_ACTION content://contacts/ -- 显示可遍历的联系人列表。这是用来进入联系人应用主界面(顶级入口,top-level entry)的典型方法。在这个界面中察看某个联系人会产生一个新的 Intent:{VIEW_ACTION content://contacts/N},用来启动新的Activity,显示该联系人的详细信息。
ü         PICK_ACTION content://contacts/ -- 先是可遍历的联系人列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给"上级活动"(parent activity)。例如:电子邮件客户端可以使用这个 Intent,要求用户在联系人列表中选择一个联系人。
除了 action, data 两个主要属性,Intent 还具有一些其它属性,这些属性也可以被用在Intent 里:
category -- 类别,被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在 Launcher 中作为顶级应用出现;而 ALTERNATIVE_CATEGORY 表示当前的 Intent 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。
type -- 数据类型,显式指定 Intent 的数据类型 (MIME)。一般上 Intent 的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
component -- 组件,为使用 Intent 的组件类指定名称。通常会根据 Intent 中包含的其它信息 —— 比如 action, data/type, categories —— 进行查找,最终找到一个与之匹配的组件。如果这个属性存在的话,将直接使用它指定的组件,不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。
extras -- 额外的附加信息,是其它所有附加信息的集合。使用 extras 可以为组件提供扩展信息,比如,如果要发送电子邮件,也就是要执行“发送电子邮件”的动作,可以将电子邮件的标题、正文等保存在 extras 里。
在 Intent 类里定义了多种标准 action 和 category 常量(字符串),同时应用也可以根据自己的需要进行定义。这些字符串使用 JAVA 风格的 scoping,从而保证它们的唯一性。比如标准 VIEW_ACTION 的定义是 “android.app.action.VIEW”。
概括而言,“动作”、“数据类型”、“类别”(译注:Intent的action类 型)和“附加数据”一起形成了一种语言。这种语言使得系统能够理解诸如“打john的手机”之类的短语。随着应用不断的加入到系统中,它们可以添加新的“ 动作”、“数据类型”、“类别”来扩展这种语言。应用也可以提供自己的 activities 来处理已经存在的“短语”,从而改变这些“短语”的行为。
 
 2解析Intent
Intent 有两种主要形式:
ü         显式意图(直接意图?)。显式意图是指定了 component 属性的 intents调 用 setComponent(ComponentName) 或者 setClass(Context, Class) 可以为 intents 设定 component 属性 —— 指定具体的组件类。这些 intents 一般不包括包括其它任何信息,它们通常只是用来通知应用启动内部的 activities 作为该应用的(当前)用户界面。
ü         隐式意图(含蓄意图?)。隐式意图是没有指明 comonent 的 intents。这些 intents 必须包括足够的信息,这样系统才能确定在所有的可用组件中,对一个 intent 来说运行哪一个组件才是最合适的。
在使用 implicit intents 的时候,对于一个任意的 intent,我们需要知道用它来做什么。“Intent 解析过程”用来处理这个问题。“Intent 解析过程”将 intent 映射到可以处理它的 activity, IntentReceiver 或者 service。
Intent 解析机制主要是将已安装应用程序包里的 Intent-Filter 描述和 Intent 进行匹配。如果使用广播发送 Intent,还要在已经注册的 IntentReceiver 中尽心匹配。更多的相关描述可以在 IntentFilter 中找到。
在解析 Intent 的过程中要用到 Intent 的三个属性:动作、数据类型和类别。使用这些属性,就可以 PackageManager 上查询能够处理当前 intent 的合适组件。组件是否合适由 AndroidManifest.xml 文件中提供的 intent 信息决定。判断的方法如下:
1、如果 intent 指明了要执行的 action,组件 action 列表中就必须包含着个 action,否则不能匹配;
2、如果 Intent 没有提供数据类型 (type),系统从数据 (data) 中得到数据类型。和 action 一样,组件的数据类型列表中必须包含 intent 的数据类型,否则不能匹配。
3、如果 Intent 中的数据不是 content: 类型的 URL,而且 Intent 也没有明确指定它的数据类型,将根据 Intent 中数据的 scheme (比如 http: or mailto:) 进行匹配。同上,Intent 的 scheme 必须出现在组件的 scheme 列表中。
4、如果 Intent 指定了一个或多个类别,这些类别必须全部出现在组建的类别列表中。比如 intent 中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的组件必须至少包含这两个类别。
以一个应用实例作为例子,这个应用可以让用户浏览便笺列表、查看每一个便笺的详细信息:
<manifest xmlns:andro> note{ID} 的标题。

相关文章:

  • 2022-02-27
  • 2021-10-06
  • 2022-12-23
  • 2022-02-18
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
  • 2021-08-19
猜你喜欢
  • 2022-12-23
  • 2021-12-26
  • 2022-01-24
  • 2022-12-23
  • 2022-12-23
  • 2021-10-22
  • 2021-10-10
相关资源
相似解决方案