30

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

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

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

4

3 に答える 3

50

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

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

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

「キャッシュされたバックグラウンド プロセス」の顕著な例は、ユーザーがアプリを起動し、それを少しの間調べた後、HOME を押してホーム画面に戻った場合です。プロセスに実行中のサービスがない場合は、「キャッシュされたバックグラウンド プロセス」として表示されるはずです。

デスクトップ/ラップトップのように「ディスク」に切り替えるのではなく、メモリ内に残っていますよね?

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

于 2013-01-10T14:01:39.697 に答える
20

「設定」アプリのソースコードを調べてみませんか。

私のNexus 4では、「設定」->「アプリ」->「実行中」は以下のようになっています。

ここに画像の説明を入力 ここに画像の説明を入力


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

1) フォアグラウンド プロセス、
2) 可視プロセス、
3) サービス プロセス、
4) バックグラウンド プロセス、
5) 空のプロセス

詳細については、Android デベロッパー サイトの「プロセスとスレッド」ドキュメントを参照してください。

コードを調べたところ、「SHOW CACHED PROCESSES」は、重要度階層が「バックグラウンドプロセス」以下のプロセスを示していることがわかりました。一方、「SHOW RUNNING SERVICES」、重要度階層が「見えるプロセス」以上のものを表示します。要点を明確に示すために詳細を省略しました。この部分の完全なソース コードは、ここで確認できます。

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 システムは古いプロセスを削除して、新しいプロセスまたはより重要なプロセスのためにメモリを再利用する必要がある場合があります。保持するプロセスと強制終了するプロセスを決定するために、システムは各プロセスを「重要度階層」に配置します。

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

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

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

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

于 2014-04-30T09:41:20.257 に答える
1

プロセスランク

Android オペレーティング システムは、できるだけ長くアプリケーションの実行を維持しようとしますが、使用可能なメモリが少なくなると、最初に重要度の低いプロセスを強制終了して、システム内のリソースを解放しようとします。

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

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

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

出典

非同期 Android プログラミング - 第 2 版 - ヘルダー バスコンセロス - 2016 年 7 月

于 2016-10-26T06:33:37.807 に答える