CountDownTimer继续在后台打勾 - 如何在onResume中检索该计数?

时间:2013-02-28 19:42:06

标签: java android countdowntimer

我有一个有多个计时器的应用程序;当我开始使用它时,我可以看到它在Eclipse中的Logcat中倒计时。

当我点击 Back 按钮时,在应用程序中调用了onStop()但是计时器继续在logcat中倒计时(onTick()正在继续打勾)。< / p>

我希望在调用onResume()时,我想让那个仍在倒计时的计时器继续运行。这可能吗?

以下是开始倒计时的按钮:

//Button1 Timer
final CountDown button1 = new CountDown(420000,1000,bButton1);
bButton1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        button1.start();
        long currentTime = System.currentTimeMillis();
        //Set start time for calculating time elapsed if needed
        saveTime("START_TIME_BUTTON1", currentTime);
    }
});     

//Button2 Timer
final CountDown button2 = new CountDown(360000,1000,bButton2);
bButton2.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        button2.start();
        long currentTime = System.currentTimeMillis();
        //Set start time for calculating time elapsed if needed
        saveTime("START_TIME", currentTime);
    }
}); 

我的onResume()看起来像这样:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    //Reset the timers on appropriate buttons if there was something running
    //If nothing was running or timer finished - have button in default state

    //See if there was a button1 timer running - if not, it will be 0
    SharedPreferences start = PreferenceManager.getDefaultSharedPreferences(this);
    long startTime = start.getLong("START_TIME_BUTTON1", 0);
    long timeElapsed = (System.currentTimeMillis()-startTime);
    long timeRemaining = (420000 - timeElapsed);        
    if (timeRemaining == 0) {
    } else if (timeRemaining > 0) {
        final CountDown button1Timer = new CountDown(timeRemaining,1000,bButton1);
        button1Timer.start();
        long currentTime = System.currentTimeMillis();
            saveTime("START_TIME", currentTime);            
    } else {
    }
}

这实际上有效 - onResume()启动另一个计时器,在第一个计时器的位置,文本显示相应的数字并继续使用onTick()方法倒计时。但是现在logcat显示2个定时器倒计时而不是只有一个!

最终我不想再启动另一个计时器,我只想拿起我开始倒计时的第一个计时器并正确地显示onTick()。有没有办法做到这一点?服务会成为我想要的吗?它已经是一项服务,因为它在后台继续下降吗?

我对完成这项工作的最佳做​​法感到有些困惑。

1 个答案:

答案 0 :(得分:4)

onTick()将继续被调用,直到剩余时间达到0或您在CountDownTimer上调用cancel()。 因此,在onStop()方法中,您需要在要停止接收cancel()通知的计时器上调用onTick()

Android的CountDownTimer实现使用Handler来执行计时,方法是在每次打勾后将Message排队到Handler。很遗憾没有办法暂停CountDownTimer,所以我相信您需要创建一个新的Timer,其中包含您当前正在执行的相应值。

当您计算timeElapsed时,不应使用System.currentTimeMillis(),因为它可以随时更改,而应使用SystemClock.elapsedRealtime()System.currentTimeMillis()是用于挂钟(时间和日期)的计时器,因此可以无法预测地更改,请参阅Android documentation