android应用开发之intent详解

Android开发组件——Intent

Intent提供了一种通用的消息系统,允许你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。通过使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

Intent的意思是意图,也就是说App通过Intent向android表达自己的意图即想干什么,想启动另一个Activity或者去调用其它的App等等;Intentfilter反应了App对意图的响应能力,比如书上的例子拨号程序,在自己的App中声明一个Intentfilter对这个动作意图进行相应,这样当我们按下拨号键时,android就会在所用的Intentfilter中找到合适的App来满足。

¥  Intent的分类

Ø  显示意图

调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显示意图,明确指定了Intent应该传递到哪个组件。

Ø  隐式意图

没有明确指定组件名的Intent为隐式意图。Android系统会根据隐式意图中设置的动作、类别、数据找到最适合的组件来处理这个意图

¥  Intent究竟是什么

我们可以将Intent看成是Activity通信的标准的。比如Intent中的内容告诉了系统激发Intent的Activity需要什么服务,而服务者Activity应该满足的条件。然后就是Android系统的事了,它负责找出符合条件的Activity服务者,并将Intent给Activity服务者,然后这个Activity根据Intent中剩余的信息做出相应的操作。由上面可知,Intent包含两部分信息:

Ø  Activity服务者的信息,这个是给Android用来找到合适Activity的。

Ø  Activity服务者要做什么操作的信息,这个是给Activity服务者用的。

¥  Intent

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

¥  Intent的属性

Ø  Action

表示要执行的动作,当然也可以自定义动作,并可定义相应的Activity

来处理我们的自定义动作。

Ø  Data

也就是执行动作要操作的数据。Android中采用指向数据的一个URI

来表示。如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content:URIs。

 如果动作字段是ACTION_EDIT,数据字段包含将显示用于编辑的文

档的URI;如果动作时ACTION_CALL。数据字段将是一个tel:URI和将拨  打的号码;如果动作是ACTION_VIEW,数据字段是一个http:URI,接收活动将被调用去下载和显示URI指向的数据。

Ø  Type

数据类型,显示指定Intent的数据类型(MIME)。一般Intent的数据

类型能够根据数据本身进行判断,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

Ø  Category

被执行动作的附加信息。例如LAUNCHER_CATEGORY表示intent的接

受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一数据上执行。Alternative表明,这个Activity可以变成OptionMenu,供其他Activity直接调用。

Ø  Component

指定Intent的目标组件的类名称。通常Android会根据Intent中包含

的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

Ø  Extra

是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,

比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

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,解析得到的目标组件必须至少包含这两个类别。

当匹配一个intent到一个能够处理数据的组件,通常知道数据的类型(它

的MIME 类型)和它的URI很重要。例如,一个组件能够显示图像数据,不应该被调用去播放一个音频文件。

 在许多情况下,数据类型能够从URI中推测,特别是content:URIs,它表

示位于设备上的数据且被内容提供者(content provider)控制。但是类型也能够显示地设置,setData()方法指定数据的URI,setType()指定MIME类型,setDataAndType()指定数据的URI和MIME类型。通过getData()读取URI,getType()读取类型。

¥  Intent过滤器

活动、服务、广播接收者为了告知系统能够处理哪些隐式Intent,它们

可以有一个或多个intent过滤器。每个过滤器描述组件的一种能力,即乐意接收的一组Intent。实际上,它筛掉不想要的Intents,也仅仅是不想要的隐式Intents。一个显示Intent总是能够传递到它的目标组件,不管它包含什么;不考虑过滤器。但是一个隐式Intent,仅当它能够通过组件的过滤器之一才能够传递给它。

一个组件能够做的每一工作有独立的过滤器,例如,记事本中的NoteEditer活动有两个过滤器,一个是启动一个指定的记录,用户可以查看和编辑;另一个是启动一个新的、空的记录,用户能够填充并保存。

一个intent过滤器是一个IntentFilter类的实例。因为Android系统在启动一个组件之前必须知道它的能力,但是intent过滤器通常不在java代码中设置,而是在应用程序的清单文件(AndroidManifest.xml)中设置。但是有一个例外,广播接收者的过滤器通过调用Context.registerReceiver()动态地注册,它直接创建一个IntentFilter对象。

一个过滤器有对应于Intent对象的动作、数据、种类的字段。过滤器要检测隐式Intent的所有这三个字段,其中任何一个失败,Android系统都不会传递Intent给组件。然而,因为一个组件可以有多个Intent过滤器,一个Intent通不过组件的过滤器检测,其它的过滤器可能通过检测。

一个过滤器必须至少包含一个子元素,否则它将阻塞所有的Intents。

要通过检测,Intent对象中指定的动作必须匹配过滤器的动作列表中的一个。如果对象或过滤器没有指定一个动作,结果将如下:

   如果过滤器没有指定动作,没有一个Intent将匹配,所有的Intent将检测失败,即没有intent能够通过过滤器。

   如果Intent对象没有指定动作,将自动通过检查(只要过滤器至少有一个过滤器,否则就是上面的情况了)

对于一个Intent要通过种类检测,Intent对象中的每个种类必须匹配过

滤器中的一个。即过滤器能够列出额外的种类,但是Intent对象中的种类都必须能够在过滤器中找到,只有一个种类在过滤器列表中没有,就算种类检测失败!

        因此原则上如果一个Intent对象中没有种类(即种类字段为空)应该总

是通过种类测试,而不管过滤器中有什么种类。但是有个例外,Android对待所有传递给Context.startActivity()的隐式Intent好像它们至少包含”android.intent.category.DEFAULT”(对应CATEGORY_DEFAULT常量)。因此,活动想要接收隐式Intent必须要在Intent过滤器中包含”android.intent.category.DEFAULT”。

      Intents对照着Intent过滤器匹配,不仅去发现一个目标组件去激活,而且

去发现设备上的组件的其他信息。例如,Android系统填充应用程序启动列表,最高层屏幕显示用户能够启动的应用程序:是通过查找所有的包含指定了”android.intent.action.MAIN”的动作和”android.intent.category.LAUNCHER”种         类的过滤器的活动,然后在活动列表中显示这些活动的图标和标签。类似的,   它通过查找”android.intent.category.HOME”过滤器的活动发掘主菜单。

¥  Intent示例

要实现两个Activity的跳转,我们可以将要跳转的Activity类名绑定到

Intent对象中,然后通过startActivity方法激活Intent对象中所指定的Activity,关键代码如下:

你可能感兴趣的:(android应用开发另解,android四大组件)