Android がアクティビティを破壊し、プロセスを強制終了する 質問する

Android がアクティビティを破壊し、プロセスを強制終了する 質問する

こんにちは。Androidがどのようにメモリを管理しているのか知りたいのですが、どこにも正確な答えが見つかりません。現在のアクティビティスタックに5つのアクティビティ(4つは停止、1つは再開)を持つアプリケーションがあり、サービスは接続されていないと仮定します。ホームボタンを押すと、すべてのアクティビティが停止します。メモリを消費する他のアプリケーションを起動すると、デバイス全体のメモリが少なくなり始めます。質問は次のとおりです。

... 私の申請はどうなるのでしょうか?

  1. システムは、メモリを回復するために、アクティビティの 1 つまたはいくつかだけを破棄できますか?
  2. システムはアプリケーションのプロセス全体を強制終了しますか? すべてのアクティビティは適切に破棄されますか?
  3. アプリケーションが完全に強制終了された後、アプリケーションに戻るとどうなりますか? 最初から (最初の起動のように) 開始されますか、それともアクティビティを以前の状態に回復しようとしますか。/ そうである場合、スタックの一番上にあるアクティビティのみですか、それともすべてですか?

アップデート:

この質問をする前に、アクティビティ ライフサイクルを数回見たことがありますが、質問に対する答えはありませんでした。いくつかテストを行い、いくつかの答えを得ました。DDMS の「プロセスの停止」がテストの手がかりでした。

質問 1 の回答はまだテストしていませんが、ガイドには次のように書かれています。

アクティビティが一時停止または停止された場合、システムはアクティビティの終了を要求するか、単にそのプロセスを強制終了することによって、アクティビティをメモリから削除できます。

プロセスを強制終了せずに、1 つ以上のアクティビティを穏やかに破棄できるようです (onDestroy メソッドを使用)。それらに戻ると、単に (onCreate + bundle) が返されます。

質問2の答え:

はい。通常、システムはプロセス全体を強制終了します。つまり、アクティビティや静的フィールドを含むすべてのデータが破棄されます。これは適切に行われません。一時停止/停止したアクティビティに対して onDestroy または finialize() は実行されません。これが、saveInstanceState() が onPause メソッドの直前に呼び出される理由です。onPause は基本的に、何かを保存する必要がある最後のメソッドです。このメソッドの後では onStop または onDestroy が表示されないからです。システムは、保持しているオブジェクトや実行中のオブジェクトをすべて破棄して、プロセスを強制終了できます。

質問3の答え:

強制終了したアプリケーションに戻ると何が起こりますか?

  • Android 2.2 より前 - アプリケーションはランチャー アクティビティから最初から起動します。
  • 2.2 以降では、システムは以前のアプリケーション状態を復元します。これは何を意味するのでしょうか? 最後に表示されたアクティビティが再作成されることを意味します (onCreate + バンドル)。アクティビティ スタックはどうなりますか? スタックは正常ですが、その上のすべてのアクティビティが無効になります。戻るボタンで戻ると、各アクティビティが再作成されます (onCreate + バンドル)。これについては、もう 1 つあります。

通常、ユーザーがホーム画面からタスクを再度選択した場合、特定の状況では、システムはタスクをクリアします (ルート アクティビティより上のスタックからすべてのアクティビティを削除します)。通常、これは、ユーザーが 30 分など、一定の時間タスクにアクセスしなかった場合に実行されます。

結論?

  1. アクティビティの回転の問題の処理は、android:configChanges="orientation" で解決できると考えないでください。そうすると、気付いていない他の多くの問題が発生します。
  2. DDMS - プロセス停止ボタンを使用してアプリケーションをテストします。これを見て
  3. 静的変数を使用するときは注意してください。アクティビティ 1 で初期化したからといって、アクティビティ 2 でも初期化されるとは限りません。グローバル静的変数を安全に初期化できる唯一の場所は、Application クラスです。
  4. onStop または onDestroy が表示されない場合があることに注意してください。ファイル/データベースを閉じ、onPause でダウンローダーを停止します。アプリにバックグラウンドで何かを実行させたい場合は、フォアグラウンド サービスを使用します。

以上です...私のエッセイがお役に立てれば幸いです :)

ベストアンサー1

まずこれをご覧ください:

画像1

一時停止()システムが前のアクティビティの再開を開始しようとしているときに呼び出されます。これは通常、保存されていない変更を永続データにコミットしたり、アニメーションや CPU を消費している可能性のあるその他のものを停止したりするために使用されます。このメソッドの実装は非常に迅速に行う必要があります。このメソッドが返されるまで次のアクティビティが再開されないためです。アクティビティが前面に戻る場合は onResume() が、ユーザーに見えなくなる場合は onStop() が続きます。

オンストップ()別のアクティビティが再開され、このアクティビティを覆っているため、アクティビティがユーザーに表示されなくなったときに呼び出されます。これは、新しいアクティビティが開始されるか、既存のアクティビティがこのアクティビティの前に移動されるか、またはこのアクティビティが破棄されるかのいずれかの理由で発生する可能性があります。このアクティビティがユーザーと対話するために戻ってくる場合は onRestart() が、このアクティビティがなくなる場合は onDestroy() が続きます。

したがって、デバイスの「ホーム」ボタンを押すと、現在のフォアグラウンドアクティビティがonPause()そこに配置されonStop()、他の4つはそのまま残ります。onStop()

Google のドキュメントによると:

  • アクティビティが画面のフォアグラウンド(スタックの最上部)にある場合、そのアクティビティはアクティブまたは実行中です。
  • アクティビティがフォーカスを失ってもまだ表示されている場合は (つまり、新しい非フルサイズまたは透明のアクティビティがアクティビティの上にフォーカスされている場合)、そのアクティビティは一時停止されます。一時停止されたアクティビティは完全にアクティブです (すべての状態とメンバー情報が維持され、ウィンドウ マネージャーに接続されたままになります) が、メモリが極端に少ない状況ではシステムによって強制終了される可能性があります。
  • アクティビティが別のアクティビティによって完全に隠されている場合、そのアクティビティは停止します。アクティビティの状態とメンバー情報はすべて保持されますが、ユーザーには見えなくなるため、ウィンドウは非表示になり、他の場所でメモリが必要になったときにシステムによって強制終了されることがよくあります。
  • アクティビティが一時停止または停止された場合、システムはアクティビティの終了を要求するか、単にそのプロセスを強制終了することで、アクティビティをメモリから削除できます。アクティビティがユーザーに再度表示される場合は、完全に再起動して、以前の状態に復元する必要があります。

プロセスライフサイクルの場合:

プロセスライフサイクル3. バックグラウンド アクティビティ (ユーザーには表示されず、一時停止されているアクティビティ) はもはや重要ではないため、システムはそのプロセスを安全に終了して、他のフォアグラウンドまたは表示可能なプロセスのためにメモリを再利用することができます。そのプロセスを終了する必要がある場合、ユーザーがアクティビティに戻ると (画面に再び表示されるように)、その onCreate(Bundle) メソッドが呼び出され、以前に onSaveInstanceState(Bundle) で提供した savedInstanceState が渡され、ユーザーが最後に終了したときと同じ状態で再起動できます。

上記の引用はすべて以下のものです:Android 開発者リファレンス: アクティビティ

メモリを消費するアプリケーションを起動すると、システムが非アクティブなアクティビティを破棄してメモリをリサイクルできることが確認されています。isFinishing()アクティビティで次のように実装し、DDMS の [kill] ボタンを使用して、システムによって削除されているアクティビティを検出できます。ただし、システムは最も古いアクティビティを最初に破棄すると思います。ただし、[Launch Activity] がリサイクルされている場合、他のアクティビティを保持しても意味がありません。

アップデート

私が見つけた意見をいくつか紹介しますここ:

停止状態

アクティビティが表示されていないが、まだメモリ内にある場合、そのアクティビティは停止状態にあると言います。停止したアクティビティは、前面に戻されて再び実行中のアクティビティになることがあります。または、破棄されてメモリから削除されることもあります。

システムがアクティビティを停止状態に維持するのは、ユーザーが近いうちにそれらのアクティビティに戻りたいと考える可能性が高いためであり、停止したアクティビティを再開する方がアクティビティを最初から開始するよりもはるかに安価です。これは、すべてのオブジェクトがすでにメモリにロードされており、それをすべてフォアグラウンドに表示するだけで済むためです。

停止されたアクティビティはいつでもメモリから削除できます。

おすすめ記事