在Android中实现一直处于活动状态的计时器(即使在屏幕超时期间)

时间:2010-10-31 21:26:13

标签: android service timer timeout

我在我的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),还是有其他机制?

2 个答案:

答案 0 :(得分:4)

这就是AlarmManager的用途。

答案 1 :(得分:0)

在这里提出另一个答案毫无意义,但出于哲学原因。

AlarmManager肯定不是这里的答案,但是,Handler也不是。如果您担心runnable可以作用于您正在运行的线程以外的线程(如本回答Updating GUI: Runnables vs Messages中所述),则执行Handler。

真正的答案是,如果你有理由在你自己的应用程序中计算某些东西,这意味着你可能需要将域事件整合到你的模型中,例如,如果我要成为发送电子邮件,我会有一些关于电子邮件状态/转换的事件。这就是反应式编程的原因:将响应过程的过程拉到软件的设计层面,而不仅仅是将调度视为一个锅炉房细节,这些细节隐藏在一层“对象”之下。