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