1

60秒からカウントダウンするCountdownTimerがあります。この CountdownTimer は textView を残りのミリ秒に設定することで機能しますが、デバイスを回転させるたびに CountdownTimer がリセットされます。

アクティビティがローテーションで再起動されるため、これが発生することはわかっています。そのため、アクティビティが再起動された後、残り時間をバンドルに保存してから復元しようとしました。

long transferValue;

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

    Log.d("Debug", "onCreate: " + transferValue);

    long setTime = 60000;
    long difference = setTime - transferValue;

    new CountDownTimer(difference, 1000) {

        public void onTick(long millisUntilFinished) {
            millisUntilFinishedToSave = millisUntilFinished;
            tvCountdown.setText("" + millisUntilFinished / 1000);
        }

        public void onFinish() {
            tvCountdown.setText("done!");
        }
    }.start();

}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putLong("millisKey", millisUntilFinishedToSave);

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    transferValue = savedInstanceState.getLong("millisKey");
    Log.d("Debug", "onRestoreInstanceState(): " + transferValue);
}

ただし、これは機能しません。このコードの先頭で transferValue を初期化しています (したがって 0 を返します) が、savedInstanceState から CountdownTimer にデータを保存するにはどうすればよいですか?

07-06 20:21:30.038: D/Debug(28995): onCreate: 0
07-06 20:21:30.043: D/Debug(28995): onRestoreInstanceState(): 55994
4

3 に答える 3

4

私はあなたのタイマーにそれ自身のスレッドを与えます。あなたのタイマーはUIスレッド上にあるため(あなたが述べたように)停止されており、UIが再描画されるとアクティビティが再初期化されます。長時間実行されるすべてのプロセスには、独自のスレッドが必要です。経験則: できるだけ早く UI スレッドから抜け出します。

Service の使用例を次に示します。このサービスは、呼び出されると開始され、画面の向きが変わったり、アクティビティのフォーカスが変わったりしてもメモリに残ります。

サービスは次のとおりです。

public class Timer extends Service {

    @Override
    public IBinder onBind(Intent i) {
        return null;
    }
    @Override
    public int onStartCommand(Intent i, int flags, int startId) {
        // Put your timer code here
    }
}

次の行をマニフェストに追加する必要があります (アプリケーションの開始/終了タグの間のどこかに):

<service android:name=".Timer" />

次に、これを使用していつでもサービスを開始できます (何度でも開始できることに注意することが重要です。再帰呼び出しによって新しいサービスが作成されるわけではありません)。

startService(new Intent(this, Timer.class));
于 2012-07-06T19:05:38.640 に答える
2

System.currentTimeMillis を使用して現在のシステム時刻を取得し、その時刻に 60000 ミリ秒を加算して終了時刻として保存します。その後、何かを変更する必要があるときはいつでも、System.currentTimeMillis と EndTime を比較してください。

Endtime = System.currentTimeMillis + 60000;

その後、すべてのインスタンスで

TimeRemaining = Endtime - System.currentTimeMillis
于 2012-07-06T19:02:08.263 に答える