在实际应用中,有的时候,需要时间服务不依赖应用程序而存在
为了达到服务与应用程序独立的目的,需要获得AlarmManager 对象,可能通过如下代码获得:
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
AlarmManager有一个重要的方法public void setRepeating(int type, long triggerAtTime ,long interval, PendingIntent operation),通过该方法,可以设置执行时间间隔和相应的动作。
这个4个参数的含义如下:
(1) type: 表示警报类型,一般取值为AlarmManager.RTC (表示正常的定时器)和AlarmManager.RTC_WAKEUP(除了有定时器的功能,还会发出警报声: 响玲、震动)
(2) triggerAtTime: 第1次运行要等待的时间,单位ms
(3) interval: 表示执行的时间间隔,单位ms
(4) operation: 一个PendingIntent对象,表示到时间后要执行的操作,PendingIntent 与 Intent 类似,与Intent一个区别是,PendingIntent 可以脱离应用程序而存在
使用AlarmManager 可以实现很多功能,下面是一个定时更换壁纸的示例,先看示意图
主要代码:
public class ChangeWallpaperService extends Service {
private static int index = 0;
private int[] resIds = new int[]{R.raw.wp1, R.raw.wp2, R.raw.wp3, R.raw.wp4, R.raw.wp5};
//onStart() 方法在每次访问服务时都会被调用
@Override
public void onStart(Intent intent, int startId) {
if(index == 5)
index = 0;
InputStream inputStream = getResources().openRawResource(resIds[index++]);
try {
setWallpaper(inputStream);
}
catch (Exception e) {}
super.onStart(intent, startId);
}
// onCreate() 只会执行一次
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
在创建PendingIntent 对象时指定了 ChangeWallpaperService.class,这说明这个PendingIntent对象与ChangeWallpaperService 绑定。AlarmManager 在执行任务时会执行
ChangeWallpaperService 类中的onStart()
代码请参见 ch08_changewallpaper工程