在Android平台下,应用程序可以方便地调用其他应用程序的功能来实现自己的功能需求,这是Android的特性之一,本文将向读者介绍Android程序内部或程序之间进行交互式通信的方式。
1.Android应用程序的基本组件
Android应用程序的基本组件包括Activity、Service、BroadcastReceiver和ContentProvider等,不同组件具有不同的特性以及各自的声明周期,下面就来对每个组件做一个简单的介绍。
(1)Activity组件
Activity是最常见的一种Android组件,每个Activity都相当于一个屏幕,其为用户提供了进行交互的可视界面。应用程序可以根据需要包含一个活多个Activity,这些Activity一般都继承自android.app包下的Activity类,并且这些Activity之间的运行是相互独立的。Activity的生命周期主要包含3个阶段。
1)运行态(running state)
此时Activity显示在屏幕前台,并且具有焦点,可以和用户的操作进行交互。
2)暂停态(paused state)
此时Activity失去焦点,并被其它的运行态Activity取代在屏幕前台显示,暂停态的Activity仍然保留其状态和成员等其它信息,当系统的内存非常匮乏时,暂停态的Activity会被结束掉以获得更多的资源。
3)停止态(stopped state)
停止态的Activity不仅没有焦点,而且是完全不可见的,虽然其也保留状态和成员等信息,停止态的Activity会在系统需要的时候被结束。
当Activity在不同的状态之间切换时,可以通过重写相应的回调方法来编写状态改变时应该执行的动作。
(2)Service组件
Service没有提供与用户进行交互的表示层。Service是运行在后台的一种Android组件,当应用程序需要进行某种不需要前台显示的计算或数据处理时,就可以启动一个Service来完成,每个Service都继承自android.app包下的Service类。
Service一般由Activity或其他Context对象来启动,当启动Service之后,该Service将会在后台运行,即使启动这个Service得Activity或其他组件的生命周期已经结束,Service仍然会继续运行,直到自己的生命周期结束为止。每个Service都应该在AndroidMainfest.xml中进行声明。Service的启动方式有两种,对应的生命周期也各不相同。
(1)通过startService方法启动。当系统调用startService方法时,如果该Service还未启动,则依次调用其onCreate方法和onStart方法来启动。当其他Context对象调用stopService方法、Service调用自称的stopSelf或stopService方法时才会停止Service的执行。
(2)通过bindService方法启动。当系统调用bindService方法时,如果该Service未启动,则会调用其onCreate方法完成初始化工作,然后会将该Service和Context对象(如Activity)进行绑定,当被绑定的Context对象被销毁时,与之绑在一起的Service也会停止运行。
需要注意的是,尽管存在两种方式启动Service,但是无论Service是通过什么方式启动的,都可以将其与Context对象进行绑定。
(3)Broadcast Receiver组件
Broadcast Receiver也不提供与用户交互的表示层,其是一种负责接收广播消息并对消息作出反应的组件。在Android的系统中就存在许多这样的广播,比如电池电量过低或信号过低时,系统就会发出广播进行通知。
应用程序如果需要响应某个广播消息,应该注册对应的BroadcastReceiver对象,该对象继承自BroadcastReceiver类,该类位于Android.content包下。
1)BroadcastReceiver发布广播的方式
发布一个广播比较容易,在需要的地方创建一个Intent对象,将信息的内容和用于过滤的信息封装起来,通过调用Context.sendBroadcast方法、Context.sendOrderedBroadcast方法或者Context.sendStickyBroadcast方法将该Intent对象广播出去,淡出发布广播方式的区别如下。
通常,使用sendBroadcast或sendStickyBroadcast发送出去的Intent,所有满足条件的BroadcastReceiver都会执行其onReceive方法。但若有多个满足条件的BroadcastReceiver,其执行onReceive方法的顺序是没有保证的。而通过sendOederedBroadcast方法发送出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行onReceive方法,相同优先级的BroadcastReceiver执行onReceiver方法的顺序是没有保证的。
sendStickyBroadcast主要的不同是,Intent在发送后会一直存在,并且在以后调用registerReceiver注册相匹配的Receiver时会把这个Intent对象直接返回给新注册的Receiver。
2)BroadcastReceiver接收广播的方式
发布的广播实体是Intent,那么接收广播的时候就需要通过IntentFilter对象来进行过滤。BroadcastReceiver的生命周期比较简单,只有一个回调方法--onReceive,该方法在应用程序接收到发给自己广播时候调用,所以BroadcastReceiver的使用方法也相对简单,只需要对onReceive方法进行合理重写,在适当的地方注册该Broadcast Receiver即可。
在AndroidMainfest.xml文件中声明。注册信息包含在<receiver></receiver>标签中,并在<intent-filter>标签内设定过滤规则。
在代码中创建并设置IntentFilter对象。该IntentFilter对象包含了对广播的过滤规则,然后再需要的地方调用Context.registerReceiver方法和Context.unregisterReceiver方法进行注册和取消注册,如果采用这种方式注册,当Context对象被销毁时,该BroadcastReceiver也就不复存在了。
3)Context Provider组件
Context Provider和其它的应用程序组件有很大的不用,Context Provider主要用于不用的应用程序之间进行数据共享。在Android平台下,每个应用程序都有独立的内存空间,如果某个应用程序需要使用其它应用程序的数据,就必须采用ContextProvider对象。
每个ContextProvider都继承自Android.context包下的ContextProvider类,其功能就是提供自己的数据给外部应用程序使用,提供的数据可以存储为Android文件、SQLite数据库文件或其他合法的格式。
ContextProvider提供数据及访问数据的接口,真正访问数据的是ContextResolver对象,该对象可以与ContextProvider对象进行通信,以达到共享数据的目的。