Androidの破壊活動、プロセスの強制終了


117

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

...アプリケーションはどうなりますか?

  1. システムは、メモリを回復するために1つまたはいくつかのアクティビティのみを破棄できますか?
  2. システムはアプリケーションのプロセス全体を強制終了しますか?すべての活動はうまく破壊されますか?
  3. アプリケーションが完全に終了したときにアプリケーションに戻るとどうなりますか?(最初の開始のように)最初から開始するのでしょうか、それともアクティビティをプレビュー状態に回復しようとしますか?

更新:

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

私は質問1の答えをテストしていませんが、ガイドが言うように:

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

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

質問2の回答:

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

質問3の回答:

強制終了したアプリケーションに戻るとどうなりますか?

  • Android 2.2以前-ランチャーアクティビティを使用して、アプリケーションは最初から始まります。
  • 2.2以降-システムは以前のアプリケーションの状態を復元します。どういう意味ですか?つまり、最後に表示されたアクティビティが再作成されます(onCreate +バンドル)。アクティビティスタックはどうなりますか?スタックは問題ありませんが、スタック上のすべてのアクティビティは停止しています。戻るボタンで戻ると、それぞれが再作成されます(onCreate +バンドル)。それについてもう1つあります。

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

結論?

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

それはそれだろう...私が私のエッセイを手伝ってくれることを願っています:)


前提として、これらの5つのアクティビティは同じアプリからのものですか、それともいくつかの異なるアプリからのものですか?
2013年

1
「私は現在のアクティビティスタックに5つのアクティビティを持つアプリケーションを持っています」もちろん、それらはすべて1つの同じプロセスアプリケーションからのものです。
マーク

4
これもまさしく私の質問でした。ありがとうございます。あなたの質問と回答が私をかなり助けてくれました。
craigrs84 2013年


@マーク:この問題は今解決されましたか?もしそうなら?
Ameer Moaaviah 2013年

回答:


30

まずこれを見てください:

img1

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

onStop()別のアクティビティが再開されてこのアクティビティをカバーしているため、アクティビティがユーザーに表示されなくなったときに呼び出されます。これは、新しいアクティビティが開始されているか、既存のアクティビティがこのアクティビティの前に配置されているか、またはこのアクティビティが破棄されているために発生する可能性があります。このアクティビティがユーザーと対話するために戻ってくる場合はonRestart()が続き、このアクティビティがなくなる場合はonDestroy()が続きます。

そのため、デバイスの「ホーム」ボタンを押すと、現在のフォアグラウンドアクティビティがonPause()そのonStop()ときオンになり、他の4つはそのままになります。onStop()

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

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

そして、プロセスのライフサイクルについて:

プロセスライフサイクル 3.バックグラウンドアクティビティ(ユーザーには表示されず、一時停止されたアクティビティ)は重要ではなくなったため、システムはそのプロセスを安全に強制終了して、他のフォアグラウンドまたは可視プロセスのメモリを解放できます。プロセスを強制終了する必要がある場合、ユーザーがアクティビティに戻って(画面に再び表示される)と、onCreate(Bundle)メソッドが呼び出されます。ユーザーが最後に離れたときと同じ状態で自分自身を再起動できます。

上記の引用はすべて、Android開発者リファレンス:アクティビティから引用されています

メモリを消費するアプリケーションを起動すると、システムが非アクティビティアクティビティを破壊し、メモリをリサイクルできることが確認されています。そして、あなたは次のように実装することができisFinishing()ます:あなたの活動の中に、そしてあなたの活動のどれがシステムによって落とされているのかを検出するためにDDMSの「殺害」ボタンを使用して。しかし、私はシステムが最も古いものを最初に破壊すると思います。ただし、「起動アクティビティ」がリサイクルされた後は、他のアクティビティを保持しても意味がありません。

更新

ここから私が見つけたいくつかの意見があります

停止状態

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

システムはアクティビティを停止状態で維持します。これは、ユーザーがすぐにそれらのアクティビティに戻りたい場合があり、停止したアクティビティを再開する方が、最初からアクティビティを開始するよりもはるかに安価です。これは、既にすべてのオブジェクトがメモリに読み込まれていて、すべてをフォアグラウンドに持っていかなければならないためです。

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


4
ドキュメントはこの問題について非常に混乱していますが、個別のコンポーネント(アクティビティ、サービスなど)ではなく、プロセス全体しか削除できません。参照:stackoverflow.com/questions/7536988/...
greg7gkb

この質問は、@ greg7gkbコメントのリンクの情報で誤解を招くように更新する必要があります
Luke De Feo

1

システムは1つまたはいくつかのアクティビティのみを破棄してメモリを回復できますか?

はい。Androidは、メモリが必要になったときに、バックグラウンドで実行されているアクティビティを強制終了します。1つまたはすべてを殺すことは、いくつかの条件に依存する可能性があります。一時停止または停止したインスタンスの場合、androidはアクティビティまたはプロセス自体を強制終了できます。ここアクティビティライフサイクルでは、以下のポイントを取得できます。そのページを完全に読むことをお勧めします。それは間違いなくあなたの疑問をクリアします。

アクティビティがフォーカスを失ったがまだ表示されている場合(つまり、新しいフルサイズではない、または透明なアクティビティがアクティビティの上にフォーカスされている場合)、アクティビティは一時停止されます。一時停止されたアクティビティは完全に有効です(すべての状態とメンバー情報を保持し、ウィンドウマネージャーに接続されたままです)が、メモリが極端に少ない状況ではシステムによって強制終了される可能性があります。

アクティビティが別のアクティビティによって完全に隠されている場合、そのアクティビティは停止されます。すべての状態とメンバー情報は保持されますが、ユーザーには表示されないため、ウィンドウが非表示になり、メモリが他の場所で必要になったときにシステムによって強制終了されることがよくあります。

アクティビティが一時停止または停止した場合、システムはアクティビティを終了するように要求するか、単にプロセスを強制終了することにより、アクティビティをメモリから削除できます。ユーザーに再度表示された場合は、完全に再起動し、以前の状態に復元する必要があります。


システムはアプリケーションのプロセス全体を強制終了しますか?すべての活動はうまく破壊されますか?

アクティビティは個人に関係し、プロセスはアクティビティのグループに関係します。上記の3番目のポイントをもう一度見てください。前述のようにプロセスが強制終了されます。


アプリケーションが完全に終了したときにアプリケーションに戻るとどうなりますか?

これは再起動に似ています。再び3番目のポイントはあなたにいくつかの答えを与えますWhen it is displayed again to the user, it must be completely restarted and restored to its previous state

メモリ関連のものについての詳細は、こちらから入手してください

編集:
アプリケーションのすべてのアクティビティは、単一のプロセスで実行されます。したがって、プロセスが強制終了されると、5または10に関係なくすべてのアクティビティが強制終了されます。つまり、再起動されます。再起動すると、保存された状態がない状態でアプリケーションが開始されます。


2
私はアクティビティライフサイクルを少なくとも5回見ましたが、私の質問に答えていません。私のアプリプロセスが強制終了されたとき、あなたが言ったことは意味するでしょう-私がアプリに戻ると、それは以前の状態に復元されます。それで、私が5つの停止されたアクティビティを持っていたとき、プロセスが強制終了されたときに、それらすべてが(onDestroyが呼び出されて)死んだのでしょうか。アプリに戻ると、すべてのアクティビティが復元されましたか(onCreate +バンドル)、スタックの一番上にあるアクティビティのみ(ユーザーに表示されます)ですか?
マーク・

1
アプリケーションのすべてのアクティビティは、単一のプロセスで実行されます。したがって、プロセスが強制終了されると、5または10に関係なくすべてのアクティビティが強制終了されます。つまり、再起動されます。再起動が始まっていない保存された状態から起動するアプリケーションが発生します。..
ビナイ

1
ほとんど真実ですが、2.2以降には当てはまりません。ページの上部にある私の更新を参照してください。
マーク・

1
いいえ、これは真実ではなく、かつては真実ではありませんでした。これは、ドキュメントに基づいていますが、参照混乱を招く:stackoverflow.com/questions/7536988/...
greg7gkb

2
@JJPA Androidはメモリを解放するために単一のアクティビティを破棄することはできません。プロセスを破棄するだけです。「メモリ不足キラー」の実装に関与するAndroidコアチームメンバーであるDianne Hackborによるこの回答を参照してください:stackoverflow.com/a/7576275/1290264
bcorso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.