13.4.3. 修改BootReceiver

优质
小牛编辑
130浏览
2023-12-01

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");

}

}

  1. YambaApplication对象中有个简单的getter方法,可以返回interval选项的值。
  2. 检查用户设置,如果interval的值为INTERVAL_NEVER(零),那就不检查更新。
  3. 这个Intent负责启动UpdaterService。
  4. 将Intent与启动Service的操作绑定起来,创建新的PendingIntent。-1表示没有使用requestCode。最后一个参数表示这个Intent是否已存在,我们不需要重新创建Intent,因此仅仅更新(update)当前已有的Intent。
  5. 通过getSystemService()获取AlarmManager的引用。
  6. setInexactRepeating()表示这个PendingIntent将被重复发送,但并不关心时间精确与否。ELAPSED_REALTIME表示Alarm仅在设备活动时有效,而在待机时暂停。后面的参数分别指Alarm的开始时间、interval、以及将要执行的PendingIntent。

接下来可以将我们的程序安装在设备上(这就安装了更新的BootReceiver),并重启设备。在设备开机时,logcat即可观察到BootReceiver启动,并通过Alarm服务启动了UpdaterService。