Android程序的载体是各个应用程序包(APK),而程序运行的主体是各种“组件”。Android的一个应用程序包一般可以视为运行在一个进程中的组件的集合。
因此,Android应用程序运行的主要单位是组件。Android中的application并不是一个程序运行的实体,仅表明相关组件之间运行的上下文。
Android四种组件是:活动(android.app包中的Activity类),服务(android.app包中的Service类),广播接收器(android.content包中的BroadcastReceiver类)和内容提供者(android.content包中的ContentProvider类)。四种组件都是基础的类,在程序中一般需要经过扩展使用。
Activity是一个可见的、类似在前台运行的部件,它具有一定的生命周期,例如有在前面、在后面但可见、在后面不可见、消失等几种状态。Activity的作用相当于一个“窗口”,它作为各种控件的容器,展示给用户并进行交互。
Service是一个不可见、但是可以长期运行的部件,其他部件可以使用启动或者绑定的方式和服务进行交互。服务在后台长期存在保存上下文,并具有接口与其他部件进行交互。
BroadcastReceiver是一个不可见、只有短期运行的部件。广播的作用相当于一个“回调函数(Callback)”,只有在被调用的时候才运行。
ContentProvider表示的是内容的接口,它实际上是一个静态的部件,提供统一的数据访问和存取方式,在其下部可以使用数据存储系统来实现。
从Android应用程序的角度,各个组件对外的联系是程序处理的一个关键性问题,组件接口包括对用户的接口和对其他包的接口两部分内容。
在对用户的接口的角度,包括呈现给用户的界面和接受用户的控制,主要由Activity及其中的View对外提供,其他组件可以使用通知(Toast通知和状态栏通知)的方式和用户简单交互。
应用程序包之间的接口方面,主要由组件的标准接口提供,Activity、Service和BroadcastReceiver使用Intent作为对外的接口,ContentProvider使用URI作为对外的接口。从组件的角度,其接口分为对包内的其他组件的接口和对其他应用程序包的接口,它们的实现结构基本相同。
提示:Activity具有返回结果的启动方式只能被其他Activity所使用,其他组件对外的接口有Context就可以使用。
Androidy应用程序包的组件接口关系如图7-1所示。
图7-1 Android应用程序包的组件接口关系
在Android应用程序实现的角度,组件是Android的应用程序架构中强制需要的使用机制。基于组件可以更清晰地划分程序的结构,程序中也将具有和组件无关代码部分,例如:与UI相关控件、2D-3D图形绘制、动画等方面,与UI无关的逻辑、算法、数据存储、硬件控制等方面。这些代码需要提供功能给组件,并通过组件进行组织,进而构成一个完整的应用程序。