こんにちは、Androidがメモリをどのように管理しているのか疑問に思っています。正確な答えはどこにもありません。現在のアクティビティスタックに5つのアクティビティがあるアプリケーションがあるとします(4つが停止し、1つが再開します)。接続されているサービスはありません。HOMEボタンを押すと、すべてのアクティビティが停止します。他のメモリ消費アプリケーションを起動しましたが、全体のデバイスメモリが少なくなり始めています。そして問題は
...アプリケーションはどうなりますか?
- システムは、メモリを回復するために1つまたはいくつかのアクティビティのみを破棄できますか?
- システムはアプリケーションのプロセス全体を強制終了しますか?すべての活動はうまく破壊されますか?
- アプリケーションが完全に終了したときにアプリケーションに戻るとどうなりますか?(最初の開始のように)最初から開始するのでしょうか、それともアクティビティをプレビュー状態に回復しようとしますか?
更新:
この質問をする前に、アクティビティのライフサイクルを何度か見ましたが、質問に対する答えはありません。私はいくつかのテストを行い、いくつかの答えがあります。DDMSの「プロセスの停止」はテストの手がかりでした。
私は質問1の答えをテストしていませんが、ガイドが言うように:
アクティビティが一時停止または停止した場合、システムはアクティビティを終了するように要求するか、単にプロセスを強制終了することにより、アクティビティをメモリから削除できます。
1つ以上のアクティビティは、プロセスを終了せずに(onDestroyメソッドを使用して)穏やかに破棄できるようです。それらに戻るときに、単に(onCreate + bundle)を取得します。
質問2の回答:
はい。通常、システムはプロセス全体を強制終了します。つまり、アクティビティや静的フィールドを含むすべてのデータが破棄されます。これはうまく行われていません-一時停止/停止されたアクティビティのonDestroyまたはfinialize()を取得しません。これが、onPauseメソッドの直前にsaveInstanceState()が呼び出される理由です。onPauseは基本的に最後のメソッドであり、このメソッドの後はonStopまたはonDestroyが表示されないため、何かを保存する必要があります。システムはプロセスを強制終了して、オブジェクトが保持していることや実行していることをすべて破棄できます。
質問3の回答:
強制終了したアプリケーションに戻るとどうなりますか?
- Android 2.2以前-ランチャーアクティビティを使用して、アプリケーションは最初から始まります。
- 2.2以降-システムは以前のアプリケーションの状態を復元します。どういう意味ですか?つまり、最後に表示されたアクティビティが再作成されます(onCreate +バンドル)。アクティビティスタックはどうなりますか?スタックは問題ありませんが、スタック上のすべてのアクティビティは停止しています。戻るボタンで戻ると、それぞれが再作成されます(onCreate +バンドル)。それについてもう1つあります。
通常、ユーザーがホーム画面からタスクを再選択すると、特定の状況で、システムはタスクをクリアします(ルートアクティビティの上にあるスタックからすべてのアクティビティを削除します)。通常、これは、ユーザーが30分などの特定の時間タスクにアクセスしなかった場合に行われます。
結論?
- アクティビティローテーションの問題の処理はandroid:configChanges = "orientation"で解決できるとは思わないでください。そうすると、気づいていない他の多くの問題が発生します。
- DDMS-プロセス停止ボタンでアプリケーションをテストします。これを見る
- 静的変数を使用するときは注意してください。アクティビティ1で初期化したときに、アクティビティ2で初期化されるとは思わないでください。グローバル静的を初期化する唯一の安全な場所は、アプリケーションクラスです。
- onStopまたはonDestroyが表示されない場合があることに注意してください。ファイル/データベースを閉じ、onPauseでダウンローダーを停止します。アプリにBGで何かを実行させたい場合-フォアグラウンドサービスを使用します。
それはそれだろう...私が私のエッセイを手伝ってくれることを願っています:)