2

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

当我点击Back按钮时,onStop()在应用程序中被调用,但计时器继续在 logcat 中倒计时(onTick()继续滴答)。

我想要的是什么时候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()适当地显示。有没有办法做到这一点?服务会是我想要的吗?它是否已经是一项服务,因为它继续在后台打勾?

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

4

1 回答 1

4

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

Android 的 CountDownTimer 实现使用 aHandler通过排队 a 来执行计时,以便在每个滴答之后Message发送到。Handler不幸的是,没有办法暂停 CountDownTimer,所以我相信你需要创建一个Timer具有适当值的新的,就像你现在正在做的那样。

在计算 timeElapsed 时,不应该使用System.currentTimeMillis(),因为它可以随时更改,而应该使用SystemClock.elapsedRealtime(). System.currentTimeMillis()是用于挂钟的计时器(时间和日期),因此可能会发生不可预测的变化,请参阅Android 文档

于 2013-03-05T23:15:39.887 回答