7

Androidのメモリが不足している場合、およびOSがメモリを再請求するために必要な手順について、一貫性のないドキュメンテーションとディスカッションが行われています。具体的には、Androidはアクティビティ/フラグメント、またはプロセス全体の細かさで殺すのでしょうか?Androidのメモリ管理細分性 - アクティビティまたはプロセス?

たとえば、アクティビティBがアクティビティAの前で起動されていて(両方のアクティビティが同じアプリケーション/プロセスの一部である場合)、アクティビティBはフォアグラウンドにあり、ユーザはアクティビティBとやりとりする(想定:画面はオンのままで、現在のアプリはフォアグラウンドのままで、向きは変わらない)

2011年からのこのSO answer(GoogleのAndroidチームのDianne Hackbornによる)は、Androidがプロセスではなく、プロセスであるにもかかわらず殺すことを示しています。 Recreating an ActivityのAndroidデベロッパーページで

、それは言う:

それが現在停止していますし、長い時間の中で使用したり、フォアグラウンドの活動はそれほど多くのリソースを必要とされていない場合、システムはまた、あなたの活動を破壊する可能性システムはバックグラウンドプロセスをシャットダウンしてメモリを回復する必要があります。

"システムはバックグラウンドをシャットダウンする必要があります処理"に注意してください。 onSaveInstanceState用Androidデベロッパーページで

、それは言う:たとえば

、アクティビティBはアクティビティAの前に起動され、いくつかの点の活動でAが資源を再利用するために殺されている場合、活動の意志この方法でユーザーインターフェイスの現在の状態を保存する機会があります

これらのページや他の多くのドキュメントページやオンラインディスカッションを読んだ後、正解が何であるかは不明です。

私はフラグメントに関しても同じ質問をしています:バックグラウンドのあるフラグメントは、プロセス全体が強制終了されることなく、メモリが足りなくなって殺される可能性がありますか?

答えて

5

メモリ管理は、this Android blog postで説明されているガベージコレクション(リフェレンスされていないオブジェクトのリサイクル)とプロセスレベルで、2つの異なるレベルで行われます。 ただ1つのアクティビティを殺すという概念はありません(覚えておいてください:AndroidはLinuxに基づいており、Linuxにはアクティビティやコンポーネント、プロセスだけの概念はありません)。

この2011年の答え(GoogleのAndroidチームのDianne Hackborn)は、Androidがプロセスではなく、プロセスであることを示していることを示しています。

これは正しいです。

活動の再作成上のAndroidデベロッパーページで

に、それは言う...

はい、それは言及し「バックグラウンドプロセス」は上記のブログやthe documentationで言及正確にプロセスのカテゴリです。これは以前は存在していたが、もはや現在のフォアグラウンド/可視プロセスの一部ではないアクティビティを指します。 onSaveInstanceState用Androidデベロッパーページで

、それは言う:

(あなたがimplicit intentsを使用しているとき、そうであるように)はい、彼らはあなたが別のプロセスからのアクティビティを起動する場合を検討しています。この間、プロセスはフォアグラウンドプロセスではないため、フォアグラウンドアクティビティとフォアグラウンドサービスの組み合わせが多すぎると、確実に殺すことができます。

私はフラグメントに関しても同じ質問をしています:バックグラウンドのあるフラグメントは、プロセス全体が強制終了されることなく、メモリが足りなくなることで殺される可能性がありますか?

いいえ、断片は、メモリ不足のために殺さすることはできません。

+0

でセクションの「oom_adjと上位プロセスの重要性との関係を」本の簡単な分析を発見しました。 Linuxは活動の概念を持っていないことは分かっていますが、Androidが個々の活動を殺す能力を追加したかどうかはわかりませんでした。明確にしてくれてありがとう! –

0

私は、Androidのガイドラインとドキュメントの面で間違いを犯します(ただし、コードのドキュメントとSOの回答がより明確であればそれは素晴らしいでしょう)。 http://developer.android.com/guide/components/tasks-and-back-stack.htmlから:それはシステムメモリを回復するために必要がある場合

システムは(新しいアクティビティが開始またはタスクがバックグラウンドに移動したときのように)あなたの活動の1を停止し、システムが完全にその活性を破壊することがあります。これが起こると、活動状態に関する情報が失われます。この場合、システムは依然としてアクティビティがバックスタックに配置されていることを認識しますが、アクティビティがスタックの最上位に来ると、システムは再開するのではなく再作成する必要があります。ユーザーの作業が失われないようにするには、アクティビティにonSaveInstanceState()コールバックメソッドを実装して事前に保持する必要があります。

0

それは、「プロセス」ではなく「Androidのアクティビティ」です。混乱の一部は、メモリ分析の一部を行う「ActivityManager」の命名にあり、Android-Activityインターフェイスも管理します。しかし、ActivityManagerやその他のシステムインターフェイスから提供される情報に基づいてプロセスを停止するのは、LMK(低メモリキラー)です。

私は理にかなっていることhttp://www.programering.com/a/MjNzADMwATE.html