Intent,“意图“,是一个将要执行的动作的抽象的描述,使用Intent来协助完成android各个组件之间的通讯。Intent类结构包含动作(action)和动作对应的数据(data),典型的动作类型有MAIN、VIEW、PICK、EDIT,动作数据以URI形式表示,例如:查看一个人的联系信息,需要创建一个动作类型为VIEW的Intent,以及表示这个人的URI。我们先认识一下Intent对象如下:
1.Intent对象
一个意图Intent对象中保存一些消息内容。它包含接收这个意图的组件感兴趣的信息(如将采取的动作action、操作数据data),以及Android系统感兴趣的信息(应该处理这个意图的组件类别、如何启动一个目标活动的指令)。
1.1Intent对象的结构
Intent对象包含几个部分:组件名称Component name、动作Action、数据Data、类别Category、附加信息Extras、标志Flags。分别说明如下:
组件名称Component name:处理一个意图的组件名称。包含类名(如“com.exmample.project.app.TestActivity“)、包名(如“com.exmample.project")。
动作Action:是被执行动作的字符串命名。对广播意图来说,是发生并被报告的动作。预定义动作常量如下:
常量 | 目标组件 | Action |
ACTION_CALL | 活动 | 开始一个电话呼叫 |
ACTION_EDIT | 活动 | 显示数据给用户编辑 |
ACTION_MAIN | 活动 | 开始任务的初始活动,没有输入数据也没有输出返回 |
ACTION_SYNC | 活动 | 同步服务器与移动设备之间的数据 |
ACTION_BATTERY_LOW | 广播接收器 | 电池低电量警告 |
ACTION_HEADSET_PLUG | 广播接收器 | 耳机插拔 |
ACTION_SCREEN_ON | 广播接收器 | 屏幕开启 |
ACTION_TIMEZONE_CHANGED | 广播接收器 | 时区变化 |
其他动作定义在Android API的其他地方,也可以自定义动作。
数据Data:动作action对应的数据。不同动作伴随着不同种类的数据规格,数据种类可能有,用户需要的数据、URI(统一资源定位符)、MIME(多用途互联网邮件扩展)。例如:动作ACTION_CALL,数据字段会是一个电话号码;动作ACTION_EDIT,数据字段会包含可编辑文档的URI;动作ACTION_VIEW,数据字段会是http:URI,接收到的活动会是下载并显示URI所引用数据的请求信息。
类别Category:是一个包含关于如何处理当前意图的组件的附加信息的字符串。预定义常量如下:
常量 | 含义 |
CATEGORY_BROWSABLE | 目标活动可以被浏览器安全地唤起来,显示一个被链接引用的数据,如:一张图片、一条email信息。 |
CATEGORY_GADGET | 这个活动可以被嵌入到充当配件宿主的另外的活动里面。??? |
CATEGORY_HOME | 这个活动将显示桌面,也就是用户开机后看到的第一屏幕或者按HOME键显示的屏幕。 |
CATEGORY_LAUNCHER | 这个活动可以是一个任务的初始活动并被列在应用程序启动器的顶层。 |
CATEGORY_PREFERENCE | 目标活动是一个选择面板。 |
附加信息Extras:应该递交给意图处理组件的附加信息(键-值对)。如:一个动作ACTION_TIMEZONE_CHANGED意图有一个”时区“附加信息用来区别新的时区;动作ACTION_HEADSET_PLUG有一个”状态“附加字段表明耳机有没有插着。
标志Flags:Intent类定义的各种类型的标志。有:指示Android系统如何去加载一个活动(如这个活动应该归属的任务)、启动后如何对待它(如它是否属于当前活动列表)等。
1.2Intent对象的分类
意图Intent分成2组:显式意图、隐式意图。
- 显式意图:通过名字指明目标组件。典型被用作应用程序的内部消息(如一个活动启动一个附属服务或姐妹活动)。
- 隐式意图:不命名目标组件(组件名称字段为空)。
1.3Intent对象的用法
Intent对象通常是作为参数使用,比如说调用startActivity()来启动一个activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver, 再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的activity 或者service,所以可以将intent理解成activity之间的粘合剂。使用的要点如下:
- 通过传递一个Intent对象给Context.startActivity()或Activity.startActivityForResult(),以载入一个Activity,此Activity可以调用getIntent()来激活它的Intent。还可通过调用Activity的onNewIntent()方法来传递给它激活的Intent。一个Activity经常启动下一个,如果希望启动的那个Activity返回一个结果,可调用startActivityForResult()。例如用户先调用一个显示照片列表的Activity,从中选中一些照片,作为结果封装在一个Intent对象中调用startActivityForResult()方法,并继续传递给发出调用的Activity的onActivityResult()方法。
- 通过传递一个Intent对象给Context.startService(),启动一个服务(或给予正在运行的服务一个指令),此服务的onStart()方法接收Intent对象做相应的处理。同理,一个Intent对象也可以传递给Context.bindService(),以获取运行中的目标服务的连接,此服务的onBind()方法接收Intent对象做相应的处理。
- 应用程序可以传递Intent对象给Context.sendBroadcast()、Context.sendOrderedBroadcast()、Context.sendStickyBroadcast()等方法产生一个广播,对此广播感兴趣的广播接收器的onReceive()方法接收Intent对象做相应的处理。
2.Intent应用
Intent主要有2种应用方式:IntentReceiver、Intent Filter。下面具体谈一下实际的应用实现方法。
2.1IntentReceiver
当外部事件或用户感兴趣的事件(如电话呼入、数据网络可用等)发生时,可通过IntentReceiver广播给其他应用程序。IntentReceiver会使用NotificationManager通知用户,并不提供UI,IntentReceiver的注册方式有2种:1)在AndroidManifest.xml中注册;2)代码中使用context.registerReceiver()方法注册。IntentReceiver的调用方式有2种:1)当IntentReceiver被触发时,应用不必对请求调用IntentReceiver,系统会在需要时启动应用;2)各种应用还可以通过Context.broadcastIntent(),将它们自己的IntentReceiver广播给其他应用。
2.2Intent Filter
使用Intent Filter,描述一个组件(Activity,Service)能够操作哪些Intent。其原理就像集成电路板一样,电路中有许多元件,每个元件上都有连接其他元件的电线串起来,集成电路板相当于Android系统,元件相当于Activity或Service,元件上接线盒相当于Intent Filter,每根电线相当于Intent。看看Android项目中实际实现。要点如下:
- 在配置文件AndroidManifest.xml中设置元件(Activity,Service)时所加入的Intent Filter设定,每个Activity内可以设定0~多组Intent Filter,每组Intert Filter都是一份比较规则。当Intent被触发时,系统去检查Manifest内各元件内的Intent Filter,匹配Intent Filter,并启动合适的元件。
- Intert Filter设定内容主要包括3种:动作action、数据data、类别category。具体说明可以见上述【Intent对象】
参考地址: