15

(私のアプリケーションのために)何をonPause()に保存し、何をonSaveInstanceState() に保存するかを決定しようとして、ヒントと明確なガイドラインのために SO 全体を調べました。

私が正しく理解していれば、onSaveInstanceState()は「実行時の変更」または「現在の状態」(それが何を意味するにせよ) を保存するのに最適であり、onPause()は「永続的な状態」(それが何を意味するにせよ) を保存するのに最適です。

アプリケーションで「永続的な状態」と「現在の状態」を構成するものを判断するのにまだ苦労しています。たとえば、ユーザー設定は明らかに永続的ですがonPause()、ユーザーが変更したときに Android UI フレームワークによって常に自動的に保存される場合、それらを保存する必要がありますか?

クラス データ メンバーはonSaveInstanceState()に保存する必要がありますか? アプリケーションのすべてのクラスでこれを行う必要がありますか?

私は混乱しています。

onPause()に保存する必要があるものと に保存する必要があるものの実例を挙げていただけますonSaveInstanceState()か? つまり、デバイス構成の変更を除きます。

--

私の質問に答えた後、いくつかの新しい洞察:

4

3 に答える 3

9

あなたが言うように、フレームワークがそれを行うので、ユーザー設定を onPause に保存する必要はありません。

永続データと状態情報を区別するには、テキスト エディター アプリケーションを考えてみてください。

永続データ

ユーザーがいくつかの単語を入力した後、アプリを終了したとします。ユーザーはそのデータをファイルに保存するように明示的に指示しませんでしたが、戻ってきたときのためにそのデータを保存しておくとよいでしょう。これは永続的なデータであり、onPause() に格納する必要があります。

状態データ

同様に、2 つのタブと、現在選択されているタブを追跡する変数があるとします。これは、onSaveInstanceState() に保存する状態データです。

灰白質

最後に、エディタ内の文字数と行数を追跡するクラスがエディタ内にあるとします。これは状態データです。これを onSaveInstanceState() に保存するか、破棄して再起動時に再計算することができます。破棄するかどうかは、計算にかかる時間によって異なります。たとえば、データを格納することでネットワーク リクエストを防ぐことができる場合は、破棄します。

更なる考察

アプリをいじってみると、正しいデータをすぐに取得できなかった領域があるかどうかが明らかになります。ホームボタンを押してから、デバイスマネージャーからアプリを閉じるなどのことを必ず行ってください. これにより、アプリを一時停止するだけでなく、シャットダウンするコーナー ケースに対応できます。

UI の状態がライフサイクル イベント全体で一貫しており、ユーザー データが残っている場合は、問題ありません。

コメントに基づいて編集

ここには、いつ/何を保存するかを決定するための2つの基準があると思います。

1 つ目は非常に主観的なものです。データを保存しますか? 状態やデータの保存を強制するものは何もありません。この情報を保存すると、ユーザー エクスペリエンスが向上しますか? メールを書いていて、別のアプリからテキストをコピーして貼り付けようとしている場合、アプリが閉じられるたびに入力途中のメールが失われるとイライラします。

2 つ目の部分は、何を保存するかを決定することです。これは、所有しているデータに基づいて UI の状態を再構築できるかどうかによって異なります。たとえば、テキスト データを保存した場合、それはユーザーがテキストを編集していたことを意味する必要があります。これで、テキストの編集タブに切り替えて、保存したテキストを入力することがわかりました。

一般的に言えば、ユーザーを中断した同じ場所に戻したい場合は、その時点に戻るために必要な状態データについて考える必要があります。アプリの初期状態のロード済みバージョンを想像してみてください

  • ユーザーが最後に見た状態にするには、どのデータを変更する必要がありますか?
  • ここに戻るには、どのデータを保存する必要がありますか?

これは実際に Android がどのように機能するかであり、アクティビティは破棄されて再作成されます。ピースを再び動かすのはあなたの仕事です (そうすることを選択した場合)。

于 2012-08-09T00:24:52.497 に答える
6

これが答えです。状態は3つの異なる方法で保存できます。

1)アプリのサブクラス化(お勧めできません)。2)SharedPreferences(単純なデータに適し、迅速で信頼性が高い)3)SQLiteデータベース(より複雑で信頼性も高い)。

今あなたの質問に答えるために。アンドロイドには本当に保証はありません。いつでも、特定の関数を呼び出さずにアプリケーションを破棄する可能性があります。したがって、保存するのに不可欠なデータがある場合、答えは、取得したらすぐに保存することです。何かが必要になることがわかっている場合は、すぐに保存することには、通常、後で何かを保存することにはあまり利点がありません。

onSaveInstanceState()は、レイアウトまたは方向の変更に関連する一時変数を保存するためだけのものです。

要約すると、永続的な状態/データ(クラッシュ後も存続するはずです)は、保証がないため、できるだけ早く保存する必要があります。待つ必要onPause()はありません。それが現実です。

于 2012-08-08T23:38:10.870 に答える
0

私が持っているケースは、永続的なデータをゲームサーバーに保存したいゲームです。

これにはしばらく時間がかかる場合があるため、 で保存しようとするのは良いことでonPauseはなく、onStop.

私が行ったテストによると、ブロックonStop中にバックグラウンドで実行できるようです。少なくとも、ホームを押したときはそうです(シンプルな forでループインandでテストされています)。誰でもこのブロッキング理論を確認できますか?onPause110monPauseonStop

onStopそのバージョンの前に、呼び出される前に殺される可能性があるため、Honeycombアップ ( ) が必要です。api11+onClose

hereを参照して、表を探してkillableください-現実がドキュメントと一致する場合は別の質問です:)。

于 2012-08-27T18:35:09.813 に答える