1、1.高焕堂讲解 Intent-based ProgrammingAndroid 的 4 种嫡系组件(即 Activity、Service、IntentReceiver 和ContentProvider)之间如何互相沟通呢?这 4 种嫡系组件都是由 Android 启动的,并不是组件之间透过直接呼叫而启动的。就像我们打手机去车行叫出租车,而不是直接到街道上叫车。我们 送给行一个简讯一通电话,表明我们的意图(Intent) ,当车行经理接到此意图,就依据你的意图的内含条件而去挑选最合适的出租车,然后派遣它去接你。意图(Intent) 本身是定义为一个类别(Class),一个 Intent 对象表达
2、一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作、与动作有关的数据等。Android 则根据此 Intent 对象之叙述, 负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android 的媒婆任务就完成了。因此,Intent 对象扮演着媒体中介的角色,提供 Client 组件 Android Server 组件之间互相沟通的相关信息,实现了 Client 组件与 Server 组件之间不知而亦能用之效果,这又称为疏结合(Loosely-coupled)效果。其创造了 Server 组件抽换的自由度,这又称为 PnP(Plug and Pla
3、y)。兹以下图为例,Activity 主要是提供 UI 画面来与 User 进行互动,两个Activity 之间的直接互动较少。其它如 ContentProvider 则常是为 Activity 等提供服务的。所以 Activity 发出 Intent 对象委托 Android 挑选到适当的ContentProvider 对象(并且将 Intent 对象传递给 ContentProvider 对象)之后,通常会透过 ContentProvider 接口而呼叫 ContentProvider 的各项服务或功能。在此图所示的范例里,当我们在一个订单列表画面(如 Activity-1),点选某个订单
4、之后,希望能够呈现出此订单的采购细项画面(如 Activity-2)。此时,Activity-1 需要 发出一个 Intent 对象, 这个 Intent 对象说明了意图:包括“查找”(Get)动作、 订单 ID 等数据,然后呼叫 Activity 父类别的 startActivity (Intent intent)函数,将此 Intent 对 象传送给 Android。而 Android 会根据此 Intent 对象中的叙述,与 AndroidManifest.xml 所叙述的各嫡系类别之条件相比较,找出与此 Intent 叙述相配的 组 件( 如 Activity-2),然后 Android 将该 Intent 对象递交给它,于是 Activity-2 会根据此 Intent 对象之叙述而 执行相应的动作。(by Misoo 团队)