web-dev-qa-db-ja.com

Androidでは、実行中のプロセスとキャッシュされたバックグラウンドプロセスの違いは何ですか?

Androidでは、[設定]-> [アプリ]の[実行中]タブの下で、メモリが一部に分割されていることがわかります。「使用済みメモリ」と「空きメモリ」、またはアプリケーションも「使用済みメモリ」または「空きメモリ」に。 「メモリフリー」部分のアプリケーションは、「キャッシュされたバックグラウンドプロセス」として示されます。

では、「キャッシュされたバックグラウンドプロセス」とは何ですか?デスクトップ/ラップトップのように「ディスク」に切り替えられるのではなく、まだメモリ内にありますか?ユーザーがこれらの「キャッシュされたバックグラウンドプロセス」のいずれかをタブすると、実行中のプロセスのように、メモリ内にあるためすぐに表示されますか

Androidは、アプリケーションを「キャッシュ」するときに何をしますか?

27
JackWM

それでは、「キャッシュされたバックグラウンドプロセス」とは何ですか?

デバイスUIにリストされているものの技術的な解釈を求めているため、デバイスメーカーが設定アプリをいじくり回すことを選択した場合、定義はデバイスによって異なる場合があります。

ただし、「キャッシュされたバックグラウンドプロセス」とは、通常、フォアグラウンドアクティビティがなく、実行中のサービスがないプロセスを指します。これらのプロセスは、十分なメモリがあるためにメモリに保持されます。したがって、ご指摘のとおり、ユーザーはこれらのプロセスにすばやく切り替えることができます。 Androidさらにシステムが必要になり始めるRAMさらに他のプロセスでは、「キャッシュされたバックグラウンドプロセス」は、システムRAMを解放するために終了するプロセスになる傾向があります。

「キャッシュされたバックグラウンドプロセス」の傑出した例は、ユーザーがアプリを起動し、簡単にその周りをつついて、HOMEを押してホーム画面に戻る場合です。プロセスに実行中のサービスがない場合、「キャッシュされたバックグラウンドプロセス」としてリストに表示されると予想されます。

デスクトップ/ラップトップのように「ディスク」に切り替えられるのではなく、まだメモリ内にありますか?

正しい。 Androidデバイスはスワップ領域を使用しません。

45
CommonsWare

"Setting"アプリのソースコード をご覧ください。

Nexus 4では、[設定]-> [アプリ]-> [実行中]は次のようになります。

enter image description hereenter image description here


始める前に、Android Process。]の重要度階層には5つのレベルがあります。これらは

1)前景プロセス、
2)目に見えるプロセス、
3)サービスプロセス、
4)バックグラウンドプロセス、
5)空のプロセス

"Processes and Threads" document Android Developer site )で詳細を確認できます。

コードを調べたところ、 "SHOW CACHED PROCESSES"はそれらのプロセスを示していますwhose重要度階層が「バックグラウンドプロセス」以下である。一方、 "SHOW RUNNING SERVICES"は、これらの重要度階層が "可視プロセス」以上。要点を明確に示すために、いくつかの詳細を落としました。この部分の完全なソースコードは here で確認できます。

try {
        final int numProc = mAllProcessItems.size();
        int[] pids = new int[numProc];
        for (int i=0; i<numProc; i++) {
            pids[i] = mAllProcessItems.get(i).mPid;
        }

        ...

        for (int i=0; i<pids.length; i++) {
            ProcessItem proc = mAllProcessItems.get(i);
            changed |= proc.updateSize(context, pss[i], mSequence);
            if (proc.mCurSeq == mSequence) {
                serviceProcessMemory += proc.mSize;
            } else if (proc.mRunningProcessInfo.importance >=
                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
                backgroundProcessMemory += proc.mSize;
                MergedItem mergedItem;
                if (newBackgroundItems != null) {
                    mergedItem = proc.mMergedItem = new MergedItem(proc.mUserId);
                    proc.mMergedItem.mProcess = proc;
                    diffUsers |= mergedItem.mUserId != mMyUserId;
                    newBackgroundItems.add(mergedItem);
                } else {
                   ...
                }

               ...

            } else if (proc.mRunningProcessInfo.importance <=
                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                foregroundProcessMemory += proc.mSize;
            }
        }
    } catch (RemoteException e) {
    }


だから、質問に戻って、

デスクトップ/ラップトップのように「ディスク」に切り替えられるのではなく、まだメモリ内にありますか?

はい、まだメモリ内にありますが、最終的にはAndroidシステムは古いプロセスを削除して新しいメモリを再利用する必要があるかもしれませんより重要なプロセス:保持するプロセスと強制終了するプロセスを決定するために、システムは各プロセスを「重要度階層」に配置します。

ユーザーがこれらの「キャッシュされたバックグラウンドプロセス」のいずれかをタブすると、実行中のプロセスのように、メモリ内にあるためすぐに表示されますか?

。たとえば、 「空のプロセス」を維持する唯一の理由は、コンポーネントを次に実行する必要があるときに起動時間を改善することです。

Androidは、アプリケーションを「キャッシュ」するときに何をしますか?

知る限り、プロセスを強制終了せず、リソースを保持するだけで、ユーザーが戻ったときにすぐに応答します。

19
김준호

プロセスランク

Androidオペレーティングシステムはアプリケーションを可能な限り長く維持しようとしますが、使用可能なメモリが少ない場合、重要度の低いプロセスを強制終了してシステム内のリソースを解放しようとしますfrst 。

これは、プロセスのランキングが重要になるときです。 Androidプロセスは、高い優先度から低い優先度への次の5つのカテゴリでランク付けされます。

  • フォアグラウンドプロセス:これは、ユーザーが現在対話しているアクティビティまたはサービスをホストするプロセスです。フォアグラウンドで開始されたサービスまたはライフサイクルコールバックを実行しているサービス
  • 可視プロセス:これは、一時停止されたアクティビティまたは可視アクティビティにバインドされたサービスをホストするプロセスです
  • サービスプロセス:これは、目に見えるアクティビティにバインドされていないサービスをホストするプロセスです
  • バックグラウンドプロセス:これは、非表示のアクティビティをホストするプロセスです。バックグラウンドプロセスはすべて、Least-Recently-Used(LRU)リストに基づいてソートされます。したがって、最近使用されたプロセスは、最後に強制終了されたプロセスです。
  • 空のプロセス:これは、非アクティブなAndroidコンポーネントをキャッシュし、コンポーネントの起動時間を改善するために使用されるプロセスです。

システムがリソースを解放する必要があるポイントに達すると、プロセスランク、最後に使用されたプロセス、および実行中のコンポーネントを考慮して、強制終了できるプロセスがソートされます。

ソース

非同期Android Programming-Second Edition-Helder Vasconcelos-July 2016

1
user4813855