2017-08-03 13 views
0

私はテキストビューを持っています。これはstepuptimerのように動作します。私はハンドラを使用し、毎秒それを更新し、完全に動作します。しかし、私がアプリを閉じて開いたとき、タイマーは "0"から始まります。私は、バックグラウンドを実行している時間が欲しいと私は、アクティビティを開いたときに経過時間は0から再び開始する代わりに表示する必要があります。表示時間の形式は00:00:00です。Android - アプリが終了してもバックグラウンドでの時間を計算する

私のコードは、私がセッションを使用してupdateTimerThread内の各二回目の更新を試してみました

public class GoOnlinePage extends Activity { 

private TextView Tv_timer; 
private Handler onlineTimeHandler = new Handler(); 
private long startTime = 0L; 
private long timeInMilliseconds = 0L; 
private long timeSwapBuff = 0L; 
private long updatedTime = 0L; 
private int mins; 
private int secs; 
private int hours; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.go_online_page); 

    Tv_timer = (TextView) findViewById(R.id.txt_timer); 

    startTime = SystemClock.uptimeMillis(); 

    onlineTimeHandler.post(updateTimerThread); 


    } 



    private Runnable updateTimerThread = new Runnable() { 

    public void run() { 

     timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 

     updatedTime = timeSwapBuff + timeInMilliseconds; 

     secs = (int) (updatedTime/1000); 
     hours = secs/(60 * 60); 
     mins = secs/60; 
     secs = secs % 60; 
     if (mins >= 60) { 
      mins = 0; 
     } 


     Tv_timer.setText(String.format("%02d", hours) + ":" + 
     String.format("%02d", mins) + ":" 
       + String.format("%02d", secs)); 



     onlineTimeHandler.postDelayed(this, 1 * 1000); 

    } 

}; 

} 

です。私はアプリを開いて、私は現在の時間を取得していたと2つの時間の違いを見つけて、タイマーを更新して戻ってきた。しかし何も働かなかった。

私を助けてください。前もって感謝します。 EDIT

は私がサービスを使用して、それを解決し、BroadcastReceiverを使用してのTextViewを更新

を解決しました。私はあなたの参照のために以下のコードを添付しました。活動が再びTv_timerの新しいオブジェクトが作成されて開始されupdating.Whenあなたの活動がTv_timerオブジェクトも破壊される破壊された

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.SystemClock; 
import android.util.Log; 



public class TimerService extends Service { 
    private static String LOG_TAG = "TimerService"; 
    private IBinder mBinder = new MyBinder(); 

    Handler onlineTimeHandler = new Handler(); 
    long startTime = 0L, timeInMilliseconds = 0L, timeSwapBuff = 0L, updatedTime = 0L; 
    int mins, secs, hours; 
    String time = ""; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.v(LOG_TAG, "in onCreate"); 
     startTime = SystemClock.uptimeMillis(); 
     onlineTimeHandler.post(updateTimerThread); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     Log.v(LOG_TAG, "in onBind"); 
     return mBinder; 
    } 

    @Override 
    public void onRebind(Intent intent) { 
     Log.v(LOG_TAG, "in onRebind"); 
     super.onRebind(intent); 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     Log.v(LOG_TAG, "in onUnbind"); 
     return true; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.v(LOG_TAG, "in onDestroy"); 
     if(onlineTimeHandler!=null){ 
      onlineTimeHandler.removeCallbacks(updateTimerThread); 
     } 
    } 


    public class MyBinder extends Binder { 
     TimerService getService() { 
      return TimerService.this; 
     } 
    } 

    private Runnable updateTimerThread = new Runnable() { 

     public void run() { 

      timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 

      updatedTime = timeSwapBuff + timeInMilliseconds; 

      secs = (int) (updatedTime/1000); 
      hours = secs/(60 * 60); 
      mins = secs/60; 
      secs = secs % 60; 
      if (mins >= 60) { 
       mins = 0; 
      } 

      time = String.format("%02d", hours) + ":" + String.format("%02d", mins) + ":" 
        + String.format("%02d", secs); 


      Intent intent = new Intent(); 
      intent.setAction("com.app.Timer.UpdateTime"); 
      intent.putExtra("time", time); 
      sendBroadcast(intent); 

      onlineTimeHandler.postDelayed(this, 1 * 1000); 

     } 

    }; 
} 
+0

これはあなたを助けるかもしれません:https://stackoverflow.com/questions/13401205/android-timer-that-c​​ounts-when-app-is-closed –

+0

[SharedPreferences ](https://developer.android.com/reference/android/content/SharedPreferences.html)または何か? – shadygoneinsane

+0

@shadygoneinsane - 共有設定で保存して取得しようとしました。しかし、アプリが開いている最後の時間だけを保存します。私は、アプリが閉じているときでも、タイマーが必要です。 –

答えて

0

、人はどのスレッドです。

はまた時間が後でどこかに保存して使用することができ、アプリケーションが

0

を開始されたときにこれを達成するには、2つの方法があることができます:

  1. あなたはタイマーのServiceを使用することができ、それも実行し続けますアプリがバックグラウンドであるか、殺されている場合。
  2. 使用SharedPreferenceとアプリが強制終了されているときにタイマー値を保存し、アプリを再起動するには、単にその値を取得し、あなたのタイマーは、いくつかの永続的な場所で起動したときSharedPreferencesのように(期間
1

ストアstartTime値とを合計するときあなたのタイマーが終了するときに削除します。

Activity#onCreateメソッドでは、その永続的な値が存在する場合はそれをチェックし、現在のシステム時刻ではなくstartTimeの値を初期化します。問題のあなたのコードに関連するため

いくつかのヒント:

  • 利用new Date().getTime()の代わりSystemClock.uptimeMillis()。再起動するとコードがより堅牢になります。
  • Activity#onResumeが呼び出されたときにActivity#onPauseが呼び出され、開始すると、タイマーティッカーが停止します。あなたのために、それが見えない間にあなたのUIを更新する必要はありません。
1

いくつかの静的変数を使用するとかなり簡単です。 この例では、アクティビティがバックグラウンドで動作しているか、破壊された場合でもカウント、何SharedPreferencesやサービスがを必要としない継続:

public class MainActivity extends AppCompatActivity { 

    private static TextView txtCounter; 
    private static Handler handler; 
    private static Runnable runnable ; 
    private static int count; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     txtCounter = (TextView) findViewById(R.id.txtCounter); 
     if (handler == null) { 
      handler = new Handler(); 
      runnable = new Runnable() { 
       @Override 
       public void run() { 
        txtCounter.setText("Count = " + count); 
        count++; 
        handler.postDelayed(runnable, 1000); 
       } 
      }; 
      handler.postDelayed(runnable, 1000); 
     } 
    } 

} 

UPDATE:

一時停止するには:handler.removeCallbacks(runnable);

を再開するには: handler.postDelayed(runnable, 1000);

カウンタをリセットするにはcount = 0;

+0

どのようにカウンターを開始/停止/一時停止しますか? – Hansie

+0

更新された答えを見てください。 –

関連する問題