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

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

当我点击后退按钮时,在应用程序中调用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()方法onTick() 。 但是现在logcat显示2个计时器倒计时而不是只有一个!

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

关于完成这项工作的最佳做​​法,我有点困惑。

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

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

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