このような同様の問題に直面しています。アプリケーションでシングルトンを含むいくつかの静的クラス メンバーを使用しています。finish() を使用してメイン アクティビティを終了し、再度開始すると、すべての静的メンバーがまだ存在します。Process.killProcess(Process.myPid()); を呼び出すのは良い解決策ではないようです。また、アプリケーションを拡張するときにエラーが発生しやすいため、アプリケーションを終了するときにすべての静的メンバーを設定解除する必要もありません。では、Android アプリケーションを適切に完全に終了するにはどうすればよいでしょうか。
3 に答える
静的データ メンバーはそのままにしておきます。彼らは誰にも害を与えていません。メモリが必要になると、Android はプロセスを終了します。
@CommonsWare が言ったように、静的メンバーを残すことができ、Android OS がそれを処理します。それでも必要な場合は、 onDestroy() をオーバーライドして、すべての静的変数を無効にすることができます。次回アプリを起動すると null になります。
このトピックに関するいくつかの重要な観察事項(私が思うに):
これは、Android プログラミングの重要な側面です。ここでアクティビティのライフサイクルのドキュメントを確認してもhttp://developer.android.com/reference/android/app/Activity.htmlでは、この動作をうまく説明することはできません。
基礎となるクラスローダーの概念があり、静的変数のすべての初期設定を含むクラスをロードします。アクティビティが停止し、破棄されても、メモリに残っている可能性があります。
アプリを再度起動すると、クラスの最後の状態が取得されます (まだメモリ内にある場合)。クラスローダーがクラスを初めてロードして初期化したときのように、クラスが初期化されるわけではありません。
これは、開発/デバッグ中にアプリを再起動すると、開始する前に完全なクラスが実際に「クリーン」される理由でもありますが、その後、アプリがインストールされ、デバイスで開始/終了するときに、デバッグ中のように「実際の」開始を強制しない場合があります。
変数を無効にすると、GC の可能性が高くなります。アンロードを強制することはできません。その意味で「アプリを完全に終了する」方法はありません。
このシステムの動作を中心に、特に複雑なアプリを設計する必要があります。
これはこれまでの私の理解です。残念ながら、これに関する完全なドキュメントは見つかりませんでした。
私が間違っている場合は、ご容赦ください。