Android应用开发从入门到精通
上QQ阅读APP看书,第一时间看更新

1.6 Android应用的基本组件介绍

一个或多个基本组件组成了丰富多彩的Android应用。前面提到的Activity就是Android四大组件之一,其他三个为Service(服务)、ContentProvider(内容提供者)、BroadcastReceiver(广播接收器)。实际上,Android并不只有这四大组件,还有其他的一些组件,这些组件才构成了强大的功能丰富的Android应用。下面先对这些组件做一个简单的介绍,后面章节会进一步详细介绍每一个组件。

1.6.1 Activity

应用程序中,一个Activity通常就是一个单独的屏幕,作为与用户交互的组件,它上面可以显示一些控件,也可以监听和处理用户的事件并做出响应。Activity通过setContentView()显示指定的组件。该方法可以接收一个View对象作为参数,也可以接收一个布局资源id作为参数。但通常采用后者。图1.28分别采用了这两种方式设置了Activity中所显示的View。

图1.28 显示Activity

Activity组件继承Activity基类并且有自己的生命周期,这将在后面继续做深入的介绍。多个Activity构成了Android应用的Activity栈,当前活动的Activity位于栈顶。

1.6.2 Service

与Activity组件继承Activity基类相似,Service组件需要继承Service基类。不同的是,Service没有自己的用户界面,通常位于后台运行,用于开发监控类程序,为其他组件提供后台服务或监控其他组件的运行状态。

服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务,服务一旦启动,便有了自己独立的生命周期。

1.6.3 BroadcastReceiver

顾名思义,BroadcastReceiver代表广播接收者。你的应用可以使用它对外部事件进行过滤——只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面,但它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。

开发自己的BroadcastReceiver的步骤如下:

① 写一个继承BroadCastReceiver的类,重写onReceive(Context context,Intent intent)方法,广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态。注意:为了保证用户交互过程的流畅,一些费时的操作要放到线程里,如SMSBroadcastReceiver。

② 注册该广播接收者,注册有两种方法:程序动态注册和在AndroidManifest文件中进行静态注册(可理解为系统中注册),如图1.29和图1.30所示。

图1.29 静态注册

图1.30 动态注册

 静态注册,在AndroidManifest.xml文件中使用<receiver./>元素完成注册。下面的priority属性表示接收广播的级别,"2147483647"为最高优先级。

 动态注册,在Java代码中通过Context.registReceiver()方法注册该BroadcastReceiver。

广播有三种类型:普通广播,通过Context.sendBroadcast()发送;有序广播,通过Context.sendOrderedBroadcast()发送;异步广播,通过Context.sendStickyBroadcast()发送。不管是何种广播类型,如果BroadcastReceiver也对该消息“感兴趣”(通过IntentFilter配置),则BroadcastReceiver的onReceive(Context context,Intent intent)方法将会被触发。

1.6.4 ContentProvider

Android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统、一个SQLite数据库中,或以任何其他合理的方式存储,其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResolver来访问数据。

只有需要在多个应用程序间共享数据时才需要内容提供者。例如,我们开发了一个发送短信的程序,当发送短信时需要从联系人管理应用中读取指定联系人的数据——这就需要多个应用程序之间进行实时的数据交换。

Android系统为这种跨应用的数据交换提供了一个标准:ContentProvider。当用户实现自己的ContentProvider时,需要实现如下抽象方法。

 insert(Uri, ContentValues)——向ContentProvider插入数据。

 delete(Uri, ContentValues)——删除ContentProvider中指定数据。

 udpate(Uri, ContentValues, String, String[])——更新ContentProvider中指定数据。

 query(Uri, String[], String, String[], String)——从ContentProvider查询数据。