3.2 界面组件Activity解析
在Android中,不论是用户还是开发者,接触最多的组件当属界面组件Activity。它是Android中最复杂、最核心的组件。在本书中,笔者妄自将Activity翻译成界面组件,期望能够直白地表述出该组件的功用:构造交互界面。
3.2.1 界面组件的功能和特征
每个平台都会有其基本的界面单元用于搭建与用户进行交互的界面,比如,.NET中的Form、Symbian中的View等。Android的界面组件并没有沿用传统的客户端常用的MVC架构,它的设计理念更接近于Web页面。毕竟,Android应用的架构思想就源自于Web 2.0中Mashup的概念。
界面组件Activity与Web页面相比,在设计理念上,有如下相似之处:
1)从运行模式来看,Web页面之间通过链接进行连接,从一个页面跳到另一个页面或回退到前一个页面,从而构成了一个页面栈。在浏览器中,用户可能会打开多个这样的页面栈(用标签Tab进行划分)。但同时与用户进行交互的,只有某个页面栈的当前页面。
与之类似,Android是个多任务的操作系统。它的上面可以同时运行多个任务。每个任务都有一个界面组件栈,栈中的元素是界面组件对象的实例,其中负责与用户进行交互的是前台任务的栈顶组件(如图3-3所示)。
2)每个Web页面都会由一个或多个URL进行定位,而页面间的切换和数据传输都需要通过服务器进行处理。同样,Android的界面组件也是通过类型信息、数据URI信息、数据类型信息等描述信息进行定位的。而界面组件的切换和数据传输,都依赖于Android组件管理服务的统一调度和传递。
3)Android界面组件的功能设计和Web页面类似,都近似于功能黑盒。其行为主要取决于其输入的信息,受外部环境影响不大。完全的黑盒性质会导致一些共享数据的传输变得极其困难。因此,在Web开发中,会通过Cookie来存储一些状态信息,通过破坏一定的黑盒特征,来换取执行的效率。而出于同样的设计考虑,Android的每个应用进程都有一个应用环境对象(Application Context)。小数据量的共享数据可以通过它来进行存储,从而避免因数据在界面组件间连续传递而增加的额外开销和复杂性[1]。
图 3-3 任务和界面组件栈
总而言之,Android的界面组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页面类似。当然,这种相似性主要体现在设计思想上。在具体实现方面,Android的界面组件有自己的设计规范,同时,它能够更简便地使用线程、文件数据等本地资源。
[1]在本书的第6章,将更为详细地讨论组件间数据传递的问题。