web-dev-qa-db-ja.com

onPause / onResumeアクティビティの問題

私が取り組んでいる小さなテストアプリケーションがあり、テキストビューをカウントダウンに100から0に更新するタイマーがあります。これは正常に機能しますが、ユーザーが電話の戻るボタンを押してからアプリケーションを一時停止しようとしています。アプリを再度開いたときに、中断したところからタイマーを再開します。これが私が使用しているコードです:

@Override
public void onPause()
{
    if(this._timer_time_remaining > 0) {
        this.timer.cancel();
    }
    super.onPause();
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining));
}

@Override
public void onResume()
{
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining));

    if(this._timer_time_remaining > 0) {
        start_timer(this._timer_time_remaining);
    }
    super.onResume();
}

Start_timer()メソッドは、onTickメソッドのテキストビューを更新し、this._timer_time_remaining int変数を更新するCountDownTimerを作成します。

CountDownTimerと_timer_time_remainingは、どちらもクラスレベルで次のように宣言されています。

private CountDownTimer timer;
private int _timer_time_remaining;

Log.v()の出力から、onPauseが呼び出されたときに_timer_time_remaining変数に正しい秒数が格納されていることがわかりますが、onResumeの開始時に0に戻されます。変数がリセットされるのはなぜですか?アプリケーションは同じ値でバックグラウンドで実行し続けると思いました。何か不足していますか?これはすべて、Activityを拡張するクラスで宣言されています。

前もって感謝します!

注:コードのコピーをクリーンアップするために編集されました

14
Blather

アクティビティライフサイクル の図を見ると、onPauseが呼び出された後、アクティビティについて保証されていないことがわかります。 Androidは、onDestroyを呼び出さなくてもアクティビティを強制終了する可能性があります。 onSaveInstanceState を使用して状態を保存し、 onRestoreInstanceState を使用して状態を復元する必要があります。

これ が役立つかもしれません。

編集:

ライフサイクルはさまざまなシナリオをカバーしています。アクティビティが1つしかない場合、[戻る]を押すことは、アプリケーションを終了することと同じです。アクティビティBを開始するアクティビティAがある場合、アクティビティAに対してonSaveInstanceStateが呼び出されます。アクティビティBを押して戻ると、終了してアクティビティAに対してonRestoreInstanceStateが呼び出されます。アプリケーションの2つの異なる実行間でデータを保存しようとしています。これには、何らかの 永続的ストレージ を使用する必要があります。

16

これは私が値を保存する方法です:(4行のコード)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
SharedPreferences.Editor edit = example.edit();
edit.putInt("time_remaining", (Integer)this._timer_time_remaining);
edit.commit();

再開時に、これを実行します:(2行のコード)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
int time_remaining = example.getInt("time_remaining", 0);

私は自分の作業コードの一部からこれを採用しましたが、実際にはこの正確な形式でテストしていません。 sharedPreferencesのドキュメントを検索して、その動作を確認してください。

2
user425923

私はAndroidのエキスパートではありませんが、タイマーがどのように動作するかを予測しています

this.timer.cancel():-タイマーをキャンセルしますが、一時停止しません

start_timer(this._timer_time_remaining):-最後の位置から継続するのではなく、タイマーを「再開」します。

だからあなたが見るものは正しいです。時間が新たに始まるたび。タイマーを一時停止するAPI(ある場合)を調べます。

1
ashoke

タイムアウトをonPauseのデータベースまたはファイルに書き込み、onResumeで読み取ることができます。

0
James

Toキーの押下(onKeyDown())を聞いて[戻る]ボタンをインターセプトし、データをSQLiteテーブルに保存することもできます。

0
Juan