Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为“Intent”的消息来激活的。 Android应用一个特点是“低耦合”,各个Activities,Services和broadcast receivers相当独立,可以看成是一个个“迷你应 用”,而Intent是这些“迷你应用”的粘合剂,Intent不但可以用于同一个Application之间Activities,Services和broadcast receivers的交互,也可以用于不同Application之间Activities,Services和broadcast receivers的交互。
Intent本身为一 个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。用个容易理解的概念,在访问网站时,我们需要提 供网站的URL,有时还需要通过URL参数,在Android世界里,Intent 的功能类似于URL,Android操作系统根据Intent来触发对于 的Activitives,Services或是Broadcast Receivers。
Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过Intent来触发的,当它们触发的机制各不相同,而且不会有重叠,也就是说发给Activity的Intent不会激活 Service或是broadcast receivers,发给broadcast receivers的Intent也不会触发Activity和Service。
Activity 通过方法 Context.startActivity() 和 Activity.startActivityForResult()来调用。以函数调用为参考 startActivity() 相当于调用无返回值的函数,startActivityForResult()调用的Activity有返回值,可以通过 Activity.setResult()来返回结果。
Context.startService()用来初始化Service,Context.bindService()可以用来建立与目标Service之间的连接,如果 Service没有运行,则会启动该Service。
Broadcast Receiver是通过 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和 Context.sendStickyBroadcast()来触发的。大部分的Broadcast消息来自于Android操作系统,如电池状态,来电,短消息等。
和URL不太一样的是,URL和网站一般是一一对应的,而一个Intent可以用来触发某个指定的Activity,Service或是 Broadcast Receiver,或是触发多个满足Intent条件的Activities,Services或是Broadcast Receivers。
下面来看看 Android OS如何根据Intent来找到满足触发条件的Activity,Service或是Broadcast Receiver. 借用SQL 数据库的概念 可以更好的理解。
SELECT (Activitives|Services|Broadcast Receivers) AS Target
FROM (List in AndroidManifest.xml)
WHERE Intent Meet Target’s (Intent Filter)
意思就是从AndroidManifest.xml中定义的 Activities,Services和Broadcast Receiver列表中查找符合Intent 条件的Activities,Services,或是Broadcast Receivers 。所有能活被激活的Activity,Service和Broadcast Receiver都必须在AndroidManifest.xml有定义,否则Android OS无法查询 到该目标,相当于数据库中无记录,即使你在代码中定义了该Activity,Service或Broadcast Receiver。
Intent
Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。它主要包含下列 信息:
Component name:可以处理该Intent的组件名称,组件名称指定义Activity,Service的包和类的全名称。比如类名为 com.pstreets.gisengine.AndroidGISEngineTutorial ,包名为com.pstreets.gisengine。 组件名称为可选项,如果指定了,意 味明确指定用来响应该Intent的Activity,Service。
Action: 列出需要执行的操作名称。或者在Broadcast Intents的情况 下给出发生的事件名称。
Constant | Target component | Action |
ACTION_CALL | activity | 开始打电话. |
ACTION_EDIT | activity | 显示编辑对话 框. |
ACTION_MAIN | activity | 作为一个任务(应用)的起始Activity,对于可以从Android应用列表的应用来说,都需要在 AndroidManifest.xml 中设置ACTION_MAIN的Intent-Filter属性。 |
ACTION_SYNC | activity | 同步数 据. |
ACTION_BATTERY_LOW | broadcast receiver | 电池电量低告警. |
ACTION_HEADSET_PLUG | broadcast receiver | 耳机插入或拔出. |
ACTION_SCREEN_ON | broadcast receiver | 屏幕打开或关闭. |
ACTION_TIMEZONE_CHANGED | broadcast receiver | 时区变动. |
Data:定义不数据的URL以及数据的MIME类型。不同的Action能够处理 的Data类型也不一样,比如 ACTION_CALL,它处理的数据格式为tel: URI,URI为电话号码。
Category: 定义了可以响应 Intent的附加信息,一个Intent可以指定多个Category类型。和Action类似,Android 预定义了一些Category类型:
Constant | Meaning |
CATEGORY_BROWSABLE | 表示目标Activity可以 使用浏览器安全显示指定连接,比如说一个图片或是Email消息. |
CATEGORY_GADGET | 表示该Activity可以当作一个Gadget嵌入到其它可以放置Gadget的Activity中。 |
CATEGORY_HOME | 表示还Activity是Home Screen,可以设置这个属性来替换Android自带的 Home Screen。 |
CATEGORY_LAUNCHER | 该Activity可以显示在Android程 序管理器中。一般应用的主Activity都会在AndroidManifest.xml 定义该属性。 |