-->

旋转后恢复CountdownTimer(Resuming CountdownTimer after

2019-09-19 04:10发布

我有一个统计从60秒下来CountdownTimer。 这CountdownTimer的工作原理是设置一个TextView到其余毫秒,但每当我转动我的设备中,CountdownTimer被复位。

我知道这是因为活动大干快上旋转重新启动。 于是,我就保存在剩余捆绑,然后恢复它,重新开始活动后的时间。

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);
}

然而,这是行不通的。 我在此代码(因此它返回0)的顶部intializing transferValue,但我怎样才能从其他的savedInstanceState到CountdownTimer保存数据?

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

Answer 1:

我想给你的计时器它自己的线程。 您的计时器被停止,因为它是在UI线程上(如你所述),当UI重绘活动被重新初始化。 所有长时间运行的进程应该有自己的线程。 经验法则:尽快走出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
    }
}

您将需要这行添加到您的清单(应用之间的某处开启/关闭标签):

<service android:name=".Timer" />

然后,你可以使用这个随时开始服务(需要注意的是,你可以启动它一遍又一遍,递归调用不作新的服务是非常重要的。):

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


Answer 2:

使用System.currentTimeMillis的得到当前系统时间,然后加60000毫秒的时间和存储作为结束时间。 然后,你必须改变的任何时间,只是比较System.currentTimeMillis的到结束时间。

Endtime = System.currentTimeMillis + 60000;

然后在每个实例

TimeRemaining = Endtime - System.currentTimeMillis


Answer 3:

该接受的答案,使事情非常复杂。 您可以在一个简单的方式做到这一点。 在你的代码的问题是,活动大干快上旋转(请参见活动生命周期)创建的,因此不会对CountdownTimer实例。

我可以写整个示例代码,但是有一个从@Drew一个很好的答案在这里: Android的内部类TextView的引用时,活动恢复



文章来源: Resuming CountdownTimer after rotation