3.1.2 基于Mashup的Android应用模型
在Mashup的概念下构造Android应用,有三个基本要素:组件(Component)、连接和配置。
❑组件
组件就是有特定功能和接口规范的实现单元。每类组件都有着不同的设计目标,或者负责界面展示,或者负责后台服务,或者负责数据提供,或者负责事件监听。
从代码实现来看,组件就是派生自特定接口或基类的子类实现。比如,界面组件Activity,就是指派生自android.app.Activity类的子类实现。
每个Android组件都是一个黑盒模块。它们依照系统设计的接口和规范实现相关的功能。组件的构造、销毁等生命周期管理工作,都是由Android中的组件管理服务统一负责。它了解所有组件的功能和特征,会选择合适的时机构造和销毁所需的组件。
❑连接
连接是一个抽象的概念,指的是组件与组件之间的通信信道,是Android为不同类别的组件之间进行调用和通信预设的模式。它的实现方式根据连接两端组件类别的不同而有所变化。比如,与界面组件的通信连接,需要通过Intent(android.content.Intent)对象来建立;而与数据源组件的通信,则通过URI地址来定位并搭建连接通路。
连接的构造,是由请求连接的组件、被连接的实现组件和组件管理服务共同维护的。请求连接的组件需要按照规范描述出所需的组件的类型和特征;实现组件,同样需要依照规范描述出它们的功能,并完成对应功能的实现;而组件管理服务会依照请求者的描述找到符合的实现组件。
❑配置
配置是用来描述组件的功能和实现特征的信息。在Android中,每个应用都有名为AndroidManifest.xml的配置文件,其中包含了该应用中所有组件的相关信息,包括组件的名称、类型、能够处理的数据格式、所需权限的信息等。
Android的组件管理服务,就是通过配置文件中的信息去了解每个组件的特征。因此,一个组件只有将相关信息写入了配置文件中,才会被系统服务认知,继而有被调用的机会。
还是通过发送邮件的例子,来进一步介绍组件、连接、配置以及基于Mashup的组件模型。如图3-1所示,当邮件应用在发送邮件时,需要添加图片作为附件,就要将相关需求按照规范封装成请求(通过Intent对象描述),并将该请求发送到Android组件管理服务中(如图3-1中的步骤A1所示)。
图 3-1 基于Mashup的组件模型示例
组件管理服务收到请求后,会扫描各个应用的组件配置信息,寻找并构造与需求匹配的图片选择组件(如图3-1中的步骤A2所示)[1],然后将请求传递给该组件,并将其切换到前台与用户进行交互(如图3-1中的步骤A3所示)。
当发送邮件的用户选择了所需图片后,图片选择组件就结束了工作,通过组件管理服务,将图片对应的地址返还给写邮件组件(如图3-1中的步骤A4),完成选择附加图片的操作。
在整个流程中,写邮件组件并不需要了解具体哪个组件帮助它进行了图片选择这项工作;同样,图片选择组件也不需要了解哪个组件需要这幅图片。它们彼此独立,在组件管理服务的调度下,共同帮用户完成选择图片发送邮件这件事情。
各个Android组件的调用流程大抵都是如此,只是根据组件功能的不同,其中具体的连接方式也会有所不同。比如,用户在写邮件的过程中选择收件人,写邮件组件就需要获取相关的联系人信息。在Android中,写邮件组件需要联系人数据的地址信息(用URI进行描述),发送给组件管理服务(如图3-1中的步骤B1)。组件管理服务会根据该地址信息,定位到该联系人数据源组件(如图3-1中的步骤B2),并构造出数据指针对象,将其返回给写邮件组件(如图3-1中的步骤B3)。
而写邮件组件拿到该数据指针对象后,就相当于与联系人数据源组件建立了一个通信连接,可以通过指针对象提供的方法,直接与联系人数据源组件交互,读取其中存放的数据,共同完成选择发件人这项任务[2]。
[1]如果有多个符合需求的组件,Android会依照默认值来加载。如果默认值尚未设置,则会通过一个对话框向用户咨询。
[2]关于组件的具体设计目标、实现方式和使用方法,可以参见本章的后续内容。