重新打开应用程序时恢复计时器

时间:2016-02-14 20:44:15

标签: java android sharedpreferences jodatime android-calendar

我正试图找到一种从特定时间开始计时计时器的方法(例如01:34:22)。目前我有一个按钮可以点击启动计时器,但我需要计时器在应用程序关闭时“继续”。

因此,我需要找到一种方法来保存计时器的开始时间,然后在使用开始时间和当前时间重新打开应用程序时恢复。

这是计时器的代码:

public abstract class CountUpTimer {
private final long interval;
private long base;

public CountUpTimer(long interval) {
    this.interval = interval;
}

public void start() {
    base = SystemClock.elapsedRealtime();
    handler.sendMessage(handler.obtainMessage(MSG));
}

public void stop() {
    handler.removeMessages(MSG);
}

public void reset() {
    synchronized (this) {
        base = SystemClock.elapsedRealtime();
    }
}

abstract public void onTick(long elapsedTime);

private static final int MSG = 1;

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        synchronized (CountUpTimer.this) {
            long elapsedTime = SystemClock.elapsedRealtime() - base;
            onTick(elapsedTime);
            sendMessageDelayed(obtainMessage(MSG), interval);
        }
    }
};

}

这是我用来设置计时器的代码:

    private void setupTimer() {
    timerTextView = (TextView) findViewById(R.id.timerTextView);
    timer = new CountUpTimer(1) {
        @Override
        public void onTick(long elapsedTime) {
            timerCount = elapsedTime;
            String finalTimer = String.format("%02d:%02d:%02d",
                    TimeUnit.MILLISECONDS.toHours(elapsedTime),
                    TimeUnit.MILLISECONDS.toMinutes(elapsedTime),
                    TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime))
            );

            timerTextView.setText(finalTimer);
        }
    };

    timer.stop();
}

在创建视图时调用。

这是点击开始按钮时的代码:

    private void addTimerLister() {
    startTimerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            timer.start();

            DateTime startTime = DateTime.now();
            long startTimeMilliseconds = startTime.getMillis();

            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("attractionTimerName", currentAttraction.name);
            editor.putLong("attractionTimerStart", startTimeMilliseconds);
            editor.putBoolean("attractionTimerRunning", true);
            editor.commit();

            animateFade();
        }
    });
}

正如您所看到的,我已经开始节省开始时间,但我需要一种方法来在重新打开应用程序时恢复计时器。如有必要,我可以使用JodaTime。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:1)

使用SharedPreferences将当前时间存储在onPause中,并在onResume中检索此时间。删除onPause中的处理程序消息,并在检索到时间后在onResume中发布消息。

重置onPause中的计时器,并使用检索到的时间在onResume中重新初始化。

timer = new CountUpTimer(retrievedTime) {
        @Override
        public void onTick(long elapsedTime) {
            timerCount = elapsedTime;
            String finalTimer = String.format("%02d:%02d:%02d",
                    TimeUnit.MILLISECONDS.toHours(elapsedTime),
                    TimeUnit.MILLISECONDS.toMinutes(elapsedTime),
                    TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime))
            );

            timerTextView.setText(finalTimer);
        }
    };

如果您不想再次重新初始化计时器,请向处理程序发送消息。

   Bundle b = new Bundle();
   b.putLong(YourClass.COUNTER_TIME, retrievedTime); // YourClass.COUNTER_TIME is a public static string
   Message msg = getHandler().obtainMessage(); // Write getHandler() in CountUpTimer
   msg.setData(b);
   mHandler.sendMessage(msg);

然后在handleMessage()

中检索它
@Override
    public void handleMessage(Message msg) {
        synchronized (CountUpTimer.this) {
            long retrievedTime = msg.getData().getLong(YourClass.COUNTER_TIME, 0)
        }
    }

如果您希望计时器在应用程序关闭或系统终止应用程序后仍在运行,请使用服务。