13.4.3. 修改BootReceiver
13.4.3.修改BootReceiver
回忆下前面的"BootReceiver"一节。BootReceiver在设备开机时唤醒,先前我们利用这一特性,在这里启动UpdaterService,而UpdaterService将一直处于运行状态。但是到现在,UpdaterService会一次性退出,这样已经不再适用了。
适用的是,使用Alarm服务定时发送Intent启动UpdaterService。为此,我们需要得到AlarmManager的引用,创建一个PendingIntent负责启动UpdaterService,并设置一个时间间隔。要通过PendingIntent启动Service,就调用PendingIntent.getService()。
例 13.14. BootReceiver.java,通过Alarm服务定时启动UpdaterService
package com.marakana.yamba8;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent callingIntent) {
// Check if we should do anything at boot at all
long interval = ((YambaApplication) context.getApplicationContext())
.getInterval(); //
if (interval == YambaApplication.INTERVAL_NEVER) //
return;
// Create the pending intent
Intent intent = new Intent(context, UpdaterService.class); //
PendingIntent pendingIntent = PendingIntent.getService(context, -1, intent,
PendingIntent.FLAG_UPDATE_CURRENT); //
// Setup alarm service to wake up and start service periodically
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE); //
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, System
.currentTimeMillis(), interval, pendingIntent); //
Log.d("BootReceiver", "onReceived");
}
}
- YambaApplication对象中有个简单的getter方法,可以返回interval选项的值。
- 检查用户设置,如果interval的值为INTERVAL_NEVER(零),那就不检查更新。
- 这个Intent负责启动UpdaterService。
- 将Intent与启动Service的操作绑定起来,创建新的PendingIntent。-1表示没有使用requestCode。最后一个参数表示这个Intent是否已存在,我们不需要重新创建Intent,因此仅仅更新(update)当前已有的Intent。
- 通过getSystemService()获取AlarmManager的引用。
- setInexactRepeating()表示这个PendingIntent将被重复发送,但并不关心时间精确与否。ELAPSED_REALTIME表示Alarm仅在设备活动时有效,而在待机时暂停。后面的参数分别指Alarm的开始时间、interval、以及将要执行的PendingIntent。
接下来可以将我们的程序安装在设备上(这就安装了更新的BootReceiver),并重启设备。在设备开机时,logcat即可观察到BootReceiver启动,并通过Alarm服务启动了UpdaterService。