2017-07-05 52 views
0

在我正在工作的應用程序中,我需要有一個計時器來跟蹤從第一次登錄到滿足特定目標爲止的時間。對於計時器我一直在使用天文臺。Android天文臺總是重置爲00:00

我的問題是,如果用戶強制關閉應用程序從他們的後臺應用程序將重置計時器。我需要計時器來堅持和更新,即使應用程序被用戶強制關閉。

目前,我的代碼如下:

  try{ 
      FileInputStream fileIn = openFileInput(timerFilename); 
      InputStreamReader InputRead = new InputStreamReader(fileIn); 

      char[] timeInputBuffer = new char[HomeScreen.READ_BLOCK_SIZE]; 
      t=""; 
      int timeCharRead; 

      while((timeCharRead = InputRead.read(timeInputBuffer))> 0){ 
       String readString = String.copyValueOf(timeInputBuffer, 0, timeCharRead); 
       t += readString; 
      } 
      InputRead.close(); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 

if(t == null) { 
     try { 
      mChronometer.setBase(SystemClock.elapsedRealtime()); 
      mChronometer.start(); 
      FileOutputStream fileout = openFileOutput(timerFilename, MODE_PRIVATE); 
      OutputStreamWriter outputWriter = new OutputStreamWriter(fileout); 
      outputWriter.write(Long.toString(SystemClock.elapsedRealtime())); 
      outputWriter.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    else{ 
     long currentTime = SystemClock.elapsedRealtime() - Long.parseLong(t); 

     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
     sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 

     mChronometer.setBase(currentTime); 
     mChronometer.setText(sdf.format(new Date(currentTime))); 
     mChronometer.start(); 
    } 

我都略去了一些無關的代碼。

的主要問題是,供應currentTimemChronometer.setBase(),然後調用mChronometer.start()後計時器似乎是完全隨機的,不能啓動,我想它。

我從網上調查瞭解到,調用setBase()和start()仍然會導致定時器從00:00開始計數,但我的印象是調用mChronometer.setText()應該解決這個問題,事實並非如此。

所以我的問題,即使應用程序被強行關閉,我如何保持計時器準時?

回答

0

從developer.android.com

服務是在後臺運行以執行 長時間運行的操作或用於遠程進程執行工作的分量。 A 服務不提供用戶界面。例如,服務 可能在後臺播放音樂,而用戶位於不同的應用程序中,或者它可能通過網絡獲取數據,而不會阻止用戶與某個活動的交互。另一個組件(如 活動)可以啓動該服務,並讓其運行或綁定到該服務,以便 與之交互。服務是作爲服務 的子類實現的,您可以在服務開發人員指南中瞭解關於它的更多信息。

所以,只要你創建一個服務,並且用戶退出你的應用程序,它仍然會運行。就像上面的例子。

這應該給你你需要的所有信息: https://developer.android.com/guide/components/services.html

您也可以參考this關於如何實現在服務運行的倒數計時器一個例子。


編輯:

Chronometer是Android中的UI窗口小部件(實際上是一個TextView)。所以,你不能將它用於非UI目的。嘗試使用TimerCountDownTimer代替。

ServiceTimer用法的例子參見本:

https://stackoverflow.com/a/3819721/5250273

+0

我已經嘗試通過服務但我仍然面對中計時器的復位,一旦應用程序是同樣的問題,以實現它強制關閉並重新打開。如有必要,我可以上傳更新的代碼片段 – Woooooooooooooow

+0

請參閱我的編輯 –