我正试图找到一种从特定时间开始计时计时器的方法(例如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。
有人有任何建议吗?
答案 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)
}
}
如果您希望计时器在应用程序关闭或系统终止应用程序后仍在运行,请使用服务。