代码之家  ›  专栏  ›  技术社区  ›  ddewaele

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

  •  3
  • ddewaele  · 技术社区  · 15 年前

    我在我的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);
    

    只要手机处于活动状态(没有出现屏幕超时),服务就可以正常运行,计时器将按定义的时间间隔执行其工作。即使我退出应用程序(使用后退按钮),计时器仍处于活动状态。

    但是,一旦手机进入超时状态,计时器任务就不再稳定运行。如果我让手机超时几个小时(晚上),我会看到在随机的情况下(有时间隔几个小时)计时器启动。

    什么是实现计时器的正确方法,即使在手机进入超时后,计时器仍能正常运行。我是否应该使用PowerManager和WAKE_锁(如下所述 http://code.google.com/android/reference/android/os/PowerManager.html ),还是有其他机制?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Peter Knego    15 年前

    那就是 AlarmManager 是为了。

        2
  •  0
  •   Community Mohan Dere    9 年前

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

    AlarmManager肯定不是这里的答案,但Handler也不是。当您担心有可运行文件,而这些可运行文件可以作用于您运行的线程以外的线程时,您可以执行处理程序(如本回答中所述 Updating GUI: Runnables vs Messages ).