DialogFragment
クラスによってラップされた警告ダイアログがあります。ダイアログには、項目のリストを表示するカスタム レイアウトがあります (ListView
適切なアダプターと共に使用します)。アイテムのリストはかなり巨大で重要なので、この例のようにmyのFragment
クラス内に保存します。DialogFragment
onPause()
非常にまれな状況を除いて、すべてが完全に機能します。ダイアログウィンドウを開いたままにして(「ホーム」ボタンを押して)、デバイスのメモリが少なくなると、アプリのプロセスが強制終了されます。後でアプリケーションに戻ると、ダイアログを再作成しようとしますが、左に開いているダイアログに表示されていた項目のリストを復元できないため、クラッシュします (NullPointerException
ダイアログのアダプター内に取得します)。ListView
これはFragment
、システムがアプリのプロセスを強制終了すると、ダイアログの状態を保存する も破棄されるDialogFragment
ため、リスト アダプターのデータ ソースがないため、ダイアログを再作成できないために発生します。
私があなたに求めているのは、ダイアログ ウィンドウの状態を保存するより良い方法を提供して、アプリ プロセスが強制終了された後でも再作成できるようにすること、またはアイテムのリストがそのnull
前にある場合にダイアログをキャンセルする方法を示すことです。再開されます (つまり、ダイアログの再作成中にどこかでダイアログをキャンセルすることを意味します)。時間がかかりすぎるため、データベースはそのデータを保存するための良い方法だとは思いません。アダプターの情報がない場合は、ダイアログの再作成を停止する方法を希望します。
アップデート:
アプリケーションのライフサイクル中にオブジェクトを保存する実装Parcelable
は、本当に素晴らしいアイデアです。オブジェクトへの書き込みParcel
は高速です (信頼してください。不適切に使用し始めるまで、ライフサイクルの変更の間に遅延は見られません)。また、アプリのインスタンスの状態を保存および復元するプロセスは、ActivityManager
プロセスによって管理されますActivity
。また、アプリケーション全体をホストしているプロセスは Android システムによって破棄され、オブジェクトが保存されActivityManager
た場所を維持し、新しいプロセスでゼロから再作成されている場合はその状態を復元します。この練習をするように励ましてくれた@Naveedに感謝します!Parcel
Activity
インスタンスの状態を保存することの本当の意味をまだ理解していない人への注意:
ライフサイクル イベントに沿ってインスタンスの状態を保存Activity
するということは、アプリケーションの現在の UI またはユーザーの現在の進行状況に対してのみ意味のある情報の変更を維持することを意味しますが、アプリケーションまたはユーザーが明示的にアプリを停止した場合 ([戻る] ボタン) 後で再起動します。実際には一時的なこの特定の形式の情報は、プリミティブ Java 型のメソッドを使用するか、カスタム クラスでインターフェイスを実装することにより、オブジェクトのonSaveInstanceState()
コールバック メソッド内に保存し、後でまたはcallbakcs で復元する必要があります。Bundle
put...()
Parcelable
onCreate()
onRestoreInstanceState()
ユーザーがアプリケーションを明示的に閉じるか、短時間だけ放置するかに関係なく、ユーザーにとって重要な他のすべてのデータは、SQLite
データベースやSharedPreferences
システムなどの永続的なストレージに保存する必要があります。アプリケーションには、以前の進行状況が再び必要です。この形式のデータは、コールバック メソッド内に保存する必要があります。これonPause()
は、リソースを回復する必要がある場合にシステムがアプリのプロセスを破棄できるようになる前に呼び出されることが保証されている最後のメソッドであるためです。の後に呼び出されるメソッドでデータを保存することを選択した場合onPause()
、つまりonStop()
またはonDestroy()
、非常に悪い (ただし、必ずしもまれではありません) 場合にシステムがアプリをすぐに強制終了することを決定した場合、これらのメソッドが呼び出されない可能性があるため、データが保存されないという大きなリスクがあります。
SharedPreferences
別のこと:リスト、コレクション、またはバンドルを保存するように構築されていないため、少量のデータを保存する場合にのみ使用してください。アプリケーション用のデータベース インターフェイスを実装するのにさらに数時間費やすことを検討し、SQLite
それをより快適に使用して大量の情報を維持することを検討してください。