[英]android stopwatch stops working when screen is off
嗨,我最近做了一個簡單的秒表應用程序,它工作正常。 但是,當我切換屏幕並將其重新打開時,計時器顯示最后一個時間值。 例如,如果計時器顯示00:00:10,則轉動屏幕(持續5秒)將其重新打開,它將顯示相同的值並開始增加時間值。
有什么建議嗎?
謝謝
if (savedInstanceState != null) {
seconds = savedInstanceState.getInt("seconds");
running = savedInstanceState.getBoolean("running");
wasRunning = savedInstanceState.getBoolean("wasRunning");
}
runTimer();
}
public void onClickStart(View view){
running = true;
}
public void onClickStop(View view){
running = false;
}
public void onClickReset(View view){
running = false;
seconds = 0;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("seconds", seconds);
savedInstanceState.putBoolean("running", running);
savedInstanceState.putBoolean("wasRunning",wasRunning);
}
@Override
protected void onPause(){
super.onPause();
wasRunning = running;
running = false;
}
@Override
protected void onResume(){
super.onResume();
if(wasRunning){
running = true;
}
}
@Override
protected void onStop(){
super.onStop();
wasRunning = running;
running = false;
}
@Override
protected void onStart(){
super.onStart();
if(wasRunning){
running = true;
}
}
private void runTimer(){
final TextView timeView = (TextView)findViewById(R.id.time_view);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
int hours = seconds/3600;
int minutes = (seconds%3600)/60;
int secs = seconds%60;
String time = String.format("%d:%02d:%02d",hours,minutes,secs);
timeView.setText(time);
if(running){
seconds++;
}
handler.postDelayed(this,1000);
}
});
}
@Override
protected void onPause(){
super.onPause();
wasRunning = running;
running = false;
}
@Override
protected void onResume(){
super.onResume();
if(wasRunning){
running = true;
}
}
@Override
protected void onStop(){
super.onStop();
wasRunning = running;
running = false;
}
@Override
protected void onStart(){
super.onStart();
if(wasRunning){
running = true;
}
}
只需查看代碼,只要您的活動Pauses
或Stops
您就會將running
的值更改為false
。 並查看Timer,如果running
為true
,它只會增加值。
秒表應該在后台運行的服務中創建。 您的活動應該只讀取並顯示服務邏輯的時間。
現在你的秒表是活動生命周期線程的bindend,因此當你的活動/應用程序在后台時,時間計數就會停止。
請參見此處的正確實施示例。
嘗試在清單中添加此權限
<uses-permission android:name="android.permission.WAKE_LOCK" />
為確保時鍾一致性(您的問題 - 顯示自啟動以來的實時)和時鍾准確性(避免小的累積錯誤),您只需測量從開始時間開始經過的時間:
// first get the time in miliseconds
long start = System.currentTimeMillis();
然后在你的計時器測量差異:
// every now and then, get the current time and substract
long now = System.currentTimeMillis();
seconds = (now - start) / 1000;
由於您的活動可能被銷毀並且會話數據被刪除,您應該在SharedPreferences中保存和恢復您的開始時間。 您不像其他人建議的那樣需要服務。
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences();
start = settings.getLong("start_time", 0);
if (start != 0) {
running = true;
}
}
@Override
protected void onStop(){
super.onStop();
if (running) {
SharedPreferences settings = getSharedPreferences();
SharedPreferences.Editor editor = settings.edit();
editor.putLong("start_time", startTime);
editor.apply();
}
您可能想要將這些值保存在onSaveInstanceState()
Bundle中 - 但如果您長時間不使用該應用程序,系統將會銷毀這些值。 SharedPreferences
是持久的,允許您測量任何長時間。
顯然,當您啟動/停止秒表時,您需要刷新保存的startTime。 你也可以保存布爾值,這將允許你保持startTime和endTime或timeElapsed; 有很多方法可以實現這個,但基本的ideea 總是測量開始時間和現在 (或停止時間) 之間的時間差 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.