5.2.5 掌控进程的优先级

对于开发者而言,掌控应用所在的优先级是非常必要的。这可以使应用在任何状态下都可以稳定地为用户提供服务。掌控进程优先级最重要的就是把握好各个组件的优先级,在不同的组件生命周期阶段内,做适合的事情。

除此之外,Android 2.0开始支持前台服务组件,这成为开发者提升后台服务进程优先级的重要手段。大多数时候,服务组件都是默默地在后台提供服务,隶属于优先级较低的服务进程。而在有些场合下(比如播放音乐、同步设备信息等),开发者会期望提升服务组件所在进程的优先级,更稳定地为用户提供服务,不影响用户体验。

此时,开发者就可以通过Service.startForeground方法,将服务组件与Android的通知栏绑定,为后台服务打开一扇与用户交互的窗口,将所在进程提升为前台进程,避免被系统回收。

Android原生的音乐播放服务(包名为com.android.music原生应用中的Media-PlaybackService服务)就是一个典型的前台进程。当用户开始播放音乐时,会调用Service.startForeground函数将服务切换至前台状态[1]


//构造显示音乐播放信息的通知对象

//该通知对象必须有ONGOING的表示,这意味着用户可以手动取消该通知

Notification status=new Notification();

status.contentView=createMusicNotificationView();

status.flags|=Notification.FLAG_ONGOING_EVENT;

status.icon=R.drawable.stat_notify_musicplayer;

status.contentIntent=PendingIntent.getActivity(this,0,

new Intent("com.android.music.PLAYBACK_VIEWER")

.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),0);

//将服务组件与通知对象绑定,切换至前台模式

startForeground(PLAYBACKSERVICE_STATUS, status);


而当用户停止播放音乐时,音乐播放组件会取消前台状态,回到后台提供服务,避免额外的系统开销:


//停止前台状态,参数true表示连同通知一并取消

stopForeground(true);


前台状态的通知具有On-Going的标志位[2],用户无法将其切换到非前台状态,因此,在开发时需要特别注意,在结束服务后务必要将服务切换为后台状态。

[1]Service.startForeground函数是从Android 2.0(SDK 5)开始引入的,如果开发的应用需要支持更低版本的Android系统,可以参考SDK上的实现策略:http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)。

[2]关于通知的使用,可以参加第13章的相关内容。