
3.2 Android应用的基本组件
Android应用程序由组件组成,并通过项目的AndroidManifest.xml将它们绑定在一起。
Android应用中常用的基本组件有Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)、ContentProvider(数据提供器)、Intent(意图)等,下面分别进行介绍。
3.2.1 Activity
Activity用于提供可视化用户界面并与用户交互,它是最常用的组件,Activity是应用程序的显示层,显示可视化的用户界面,并接收与用户交互所产生的界面事件。
一个Activity展现一个可视化用户界面,如果需要多个可视化用户界面,该Android应用会包含多个Activity,尽管多个Activity在一起工作,但每个Activity是相对独立的,每个Activity都继承自android.app.Activity类。
例如,第一个Android应用项目FirstAndroidApplication中MainActivity.java的代码如下:

Activity的显示内容由View(视图)组件的对象提供,并定义在res/layout下的XML文件中,View组件的对象包括文本框、多选框、单选框、按钮、菜单等。
通过Activity将指定的View显示出来,调用Activity的setContentView()方法,例如上面代码中的setContentView(R.layout.activity_main)方法。
3.2.2 Service
Service是一个常用组件,需要继承Service类。Service一般用于没有用户界面,又需要长时间在后台运行的应用,例如播放背景音乐或在网络上获取数据。
Service与Activity有以下区别:Service通常位于后台运行,它一般不需要与用户交互,也没有用户界面。Service一般由Activity启动,但拥有自己独立的生命周期。Service具有较长的生命周期,当启动它的Activity生命周期结束,Service仍能继续运行,直到自己的生命周期结束。
Service有两种启动方式:
(1)使用startService方式启动。
(2)使用bindService方式启动。
3.2.3 BroadcastReceiver
BroadcastReceiver是另一个常用组件,用来接收广播消息,不包含任何用户界面,其监听的事件源是其他组件。
使用BroadcastReceiver组件接收广播信息,需要继承BroadcastReceiver类并重写onReceive方法。当其他组件通过sendBroadcast()、sendStickyBroadcast()或sendOrderBroadcast()方法发送广播消息时,如果通过IntentFilter过滤的BroadcastReceiver感兴趣,就会被接收。
BroadcastReceiver注册方式有两种:
(1)在AndroidManifest.xml中,在<receiver></receiver>标签中设置。
(2)在Java代码中,通过Context.registReceiver()方法注册。
3.2.4 ContentProvider
ContentProvider组件是Android系统提供的一种标准的共享数据的机制,用来管理和共享应用程序的数据存储。例如开发一个发送短信的程序,需要多个应用程序之间共享和交换数据。
一般的使用方法是:一个应用程序使用ContentProvider暴露自己的数据,另一个应用程序使用ContentResolver访问数据。
3.2.5 Intent
Intent是不同组件间通信的载体,是连接各个组件的桥梁。Intent不仅可以用到不同组件之间的交互,还可以用到不同应用程序之间的交互。
Activity、Service、BroadcastReceiver组件之间的通信都使用Intent作为通信的载体,但各个组件使用Intent的机制不同。
(1)当需要启动一个Activity时,可调用Context.startActivity()或Context.startActivityForResult()方法,这两个方法中的Intent参数封装了需要启动的目标Activity的信息。
(2)当需要启动一个Service时,可调用Context.startService()或Context.bindService()方法,这两个方法中的Intent参数封装了需要启动的目标Service的信息。
(3)当需要触发一个BroadcastReceiver时,可调用sendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法,这三个方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。