轮换后恢复CountdownTimer

我有一个CountdownTimer,从60秒倒数。 此CountdownTimer的工作原理是将textView设置为剩余的毫秒数,但每当我旋转设备时,CountdownTimer都会重置。

我知道这是因为Activity在轮换时重新启动。 所以我尝试在活动重新启动后保存捆绑包中的剩余时间然后恢复它。

long transferValue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_playtimemode); Log.d("Debug", "onCreate: " + transferValue); long setTime = 60000; long difference = setTime - transferValue; new CountDownTimer(difference, 1000) { public void onTick(long millisUntilFinished) { millisUntilFinishedToSave = millisUntilFinished; tvCountdown.setText("" + millisUntilFinished / 1000); } public void onFinish() { tvCountdown.setText("done!"); } }.start(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("millisKey", millisUntilFinishedToSave); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); transferValue = savedInstanceState.getLong("millisKey"); Log.d("Debug", "onRestoreInstanceState(): " + transferValue); } 

然而,这不起作用。 我正在这个代码的顶部初始化transferValue(因此它返回0),但我怎么能将来自savedInstanceState的数据保存到CountdownTimer?

 07-06 20:21:30.038: D/Debug(28995): onCreate: 0 07-06 20:21:30.043: D/Debug(28995): onRestoreInstanceState(): 55994 

我会给你的计时器它自己的线程。 您的计时器正在停止,因为它位于UI线程上(如您所述),并且当重绘UI时,重新初始化Activity。 所有长时间运行的进程都应该有自己的线程。 经验法则:尽快退出UI线程。

以下是使用服务的示例。 无论屏幕方向更改甚至活动焦点更改,此服务都会在调用时启动并保留在内存中。

这是服务:

 public class Timer extends Service { @Override public IBinder onBind(Intent i) { return null; } @Override public int onStartCommand(Intent i, int flags, int startId) { // Put your timer code here } } 

您需要将此行添加到清单(应用程序打开/关闭标记之间):

  

然后你可以随时使用它启动服务(重要的是要注意你可以一遍又一遍地启动它,递归调用不会创建新服务。):

 startService(new Intent(this, Timer.class)); 

使用System.currentTimeMillis获取当前系统时间,然后将60000毫秒添加到时间并将其存储为结束时间。 然后,只要你需要改变任何东西,只需将System.currentTimeMillis与EndTime进行比较即可。

 Endtime = System.currentTimeMillis + 60000; 

然后在每个实例上

 TimeRemaining = Endtime - System.currentTimeMillis 

接受的答案使事情变得非常复杂。 你可以用更简单的方式做到这一点。 您的代码中的问题是Activity在轮换时创建(请参阅活动生命周期),CountdownTimer实例也是如此。

我可以编写完整的示例代码,但@Drew有一个很好的答案: 活动恢复时的Android Innerclass TextView参考