我在我的Android应用程序中实现了一个服务,它启动一个计时器(使用标准的java.util.Timer和java.util.TimerTask机制)在预定义的时间间隔内在后台进行一些处理。
public class BackgroundProcessingService extends Service {
private int interval;
private Timer timer = new Timer();
public void onCreate() {
super.onCreate();
startTimer();
}
@Override
public void onDestroy() {
timer.cancel();
super.onDestroy();
}
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
private void startTimer() {
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {
// perform background processing
}
}, 0, getInterval());
; }
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
该服务由我的应用程序启动/停止。
backgroundProcessingService = new Intent(getApplicationContext(), BackgroundProcessingService .class);
startService(backgroundProcessingService);
只要手机处于活动状态(没有屏幕超时),服务就可以正常运行,并且Timer会按照定义的时间间隔执行其工作。即使我退出应用程序(使用后退按钮),计时器仍保持活动状态。
但是,一旦手机进入超时状态,计时器任务就不再稳定运行。如果我将电话暂停几个小时(晚上),我会在随机场合(有时间隔几个小时)看到计时器开始播放。
此外,当再次激活手机时,所有已排队的计时器运行都会突然执行一次,然后再恢复正常时间间隔。
即使手机进入超时状态,实现继续正常运行的计时器的正确方法是什么?我应该使用PowerManager和WAKE_LOCKS(如此处所述http://code.google.com/android/reference/android/os/PowerManager.html),还是有其他机制?
答案 0 :(得分:4)
这就是AlarmManager的用途。
答案 1 :(得分:0)
在这里提出另一个答案毫无意义,但出于哲学原因。
AlarmManager肯定不是这里的答案,但是,Handler也不是。如果您担心runnable可以作用于您正在运行的线程以外的线程(如本回答Updating GUI: Runnables vs Messages中所述),则执行Handler。
真正的答案是,如果你有理由在你自己的应用程序中计算某些东西,这意味着你可能需要将域事件整合到你的模型中,例如,如果我要成为发送电子邮件,我会有一些关于电子邮件状态/转换的事件。这就是反应式编程的原因:将响应过程的过程拉到软件的设计层面,而不仅仅是将调度视为一个锅炉房细节,这些细节隐藏在一层“对象”之下。