しかし、アプリを一時停止または停止してから再起動または再開した場合はどうなりますか?pageradapterのすべてのページのインフレは削除されますか?すべてのページを再度膨らませる必要がありますか?
アプリが意味する場合Activity、一時停止されている場合、これは単に現在フォーカスされていないことを意味しActivityます。すべての状態はまだそこにあります。これは基本的に、までフォアグラウンドイベントを受け入れることができないことを意味しますonResume()。OSがを呼び出すことを決定した場合、onSaveInstanceState()インスタンス変数の値や、読み取る新しいインスタンスのフラグなどを実際に保存できます。ただし、ここに複雑なものを保存することはできません。したがって、ThreadまたはCursorインスタンスのようなものは適切ではありません。基本的に「データ」以外のもの。
アクティビティが破棄されたり、プロセスが強制終了されたりした場合は、すべてを再バインドして再膨張させる必要があります。ただし、これの美しさは、ほとんどの場合、特別なことをする必要はありません。バンドルに書き込んだ可能性がある場合にのみ、onSaveInstanceState()追加の作業を行う必要があります。
復元された内部状態、つまり変数の値、sqlLite db、ファイルの内容です。
遷移がonPauseとonResumeの間だけだった場合は、はい。すべてがうまくいくはずです。破棄またはプロセスの強制終了があった場合、アクティビティはで再開onCreate()され、に基づいてすべての状態をリセットする必要がありBundle savedInstanceStateます。後でsqliteとファイルについて説明します。
復元されたウィジェットの値、つまりテキストボックスの文字です。
通常、それらがsaveEnabled(true)(ほとんどの場合)ありTextView、最後に設定されたテキストを記憶させるfreezesTextプロパティがある場合。ただし、ほとんどの場合、onSaveInstanceState()通話中に状態を正しく保存すると、UIだけでなく他の手段でも状態を保存している可能性があります。その場合、次の手順を実行するときにそれらを同期することをお勧めしますonCreate()
forループまたはコードブロックの途中で一時停止または停止が発生する可能性がある場合、どうすれば破損を防ぐことができますか?
したがって、メインUIスレッドで発生しますonPause()。onStop()現在UIスレッドでコードを実行している場合は、これらの他のコールバックが発生する前にコードを完了する必要があります。他のスレッドで実行している場合は、はい、UIスレッドでタスクの出力を完了するようにする必要があります。これは多くのことを単純化します。
一方、キルは発生する可能性があります。これは通常、プログラムのメモリ外のものに影響しますが、破損について話します。ファイルハンドルを開いたり、sqliteカーソルを開いたり、ネットワークソケットを開いたりした場合と同じです。そのため、使用する前に状態を確認する必要があります。
すなわち
- ディレクトリを読み書きする前に、ディレクトリが実際に存在することを確認してください
- ファイルの内容が以前に適切に書き込まれていることを確認してください(単純な予想されるチェックサムは通常、ここまたはバージョンメタデータで機能します)。
- sqliteを使用する場合はトランザクションを使用して、完全なアトミックチャンクでテーブルにデータを書き込むだけにして、そこにない他のテーブルの状態を参照する行を持つテーブルがないようにします。
- ネットワーク接続はリセットされ、選択したネットワークプロトコルなどが、接続されているアプリケーションとともに健全性チェックを処理する必要があります。
これが役立つことを願っていますが、完全ではありませんが、開始するのに適したアプローチです。