2017-01-30 73 views
1

嗨,我最近做了一個簡單的秒錶應用程序,它工作正常。但是,當我切換屏幕並將其打開時,計時器會顯示最後一次的時間值。例如,如果定時器顯示給我00:00:10,則將(5秒鐘)的屏幕重新打開並顯示相同的值,並開始增加時間值。當屏幕關閉時,android stopwatch停止工作

任何建議爲什麼?

感謝

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

} 

回答

2
@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; 
    } 
} 

只要看着你的代碼,你的running值更改爲false,只要您的活動PausesStops。 並查看定時器,它只會增加值,如果runningtrue

+0

好,那麼糾正我,如果我錯了,爲了保持秒錶運行,而屏幕是或應用程序在後臺我需要刪除這些方法? – MariusBrave

+0

是的,你必須。但嘗試使用'服務'.https://developer.android.com/guide/components/services.html –

+0

謝謝生病檢查出 – MariusBrave

1

秒錶應該在後臺運行的服務中創建。您的活動只應讀取並顯示服務邏輯的時間。

現在,您的秒錶會平移到活動生命週期線程,因此在您的活動/應用程序處於後臺時停止計時。

請參閱here一個正確的實現示例。

+0

請幫我這個 - http:// stackoverflow。com/q/41928314/4614833 – Sinscary

0

嘗試添加該權限在您的清單

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
0

爲了保證雙方時鐘的一致性(你的問題 - 顯示自啓動以來的實際時間)和時鐘精度(避免小累積誤差),你只需要測量

然後在你的計時器度量上的差異:

// 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()捆綁這些價值觀 - 但這將被系統被破壞,如果你不使用的應用程序很長一段時間。 SharedPreferences是持久的,允許您測量任何長時間。

顯然你需要在開始/停止秒錶時刷新保存的startTime。你也可以保存布爾值,這將允許你保持startTime和endTime或timeElapsed;有很多方法可以實現這一點,但基本的想法是總是測量開始時間和現在(或停止時間)之間的時間差。

+0

請幫我解決這個問題 - http://stackoverflow.com/q/41928314/4614833 – Sinscary