В Android какая разница между запущенными процессами и кэшированными фоновыми процессами?

на Android, когда я смотрю в "Настройка" - > "приложение", под вкладкой" работает", я вижу, что память разрезана на части:" используемая память "и" память свободна", также приложения либо помещаются в" используемую память", либо"память свободна". Приложения в" свободной памяти "части отмечаются как"кэшированный фоновый процесс".

Итак, что такое "кэшированные фоновые процессы"? Они все еще в памяти, а не переключены на "диск" (как это делают настольные компьютеры/ноутбуки), верно? Когда пользователь tab один из эти "кэшированные фоновые процессы" будут отображаться немедленно, поскольку они все еще находятся в памяти, как запущенный процесс, верно?

Что делает Android, когда он "кэширует" приложение?

3 ответов


Итак, что такое "кэшированные фоновые процессы"?

поскольку вы просите техническую интерпретацию чего-то, перечисленного в пользовательском интерфейсе устройства, определение может отличаться от устройства, если производители устройств решили поработать с приложением настроек.

при этом "кэшированные фоновые процессы" обычно относятся к процессам, которые не имеют активности переднего плана и не имеют запущенной службы. Эти процессы хранятся в памяти просто потому, что мы для этого достаточно памяти, и поэтому, как вы заметили, пользователь может быстро вернуться к этим процессам. Поскольку Android начинает нуждаться в большей системной ОЗУ для еще других процессов, "кэшированные фоновые процессы", как правило, процессы, которые прекращаются, чтобы освободить системную ОЗУ.

выдающимся примером "кэшированного фонового процесса" будет тот, где пользователь запустил приложение, немного поковырялся вокруг него, а затем нажал HOME, чтобы вернуться на главный экран. Если процесс не у меня есть работающая служба, я ожидал бы найти ее в списке как "кэшированный фоновый процесс".

они все еще в памяти, а не переключены на "диск" (как это делают настольные компьютеры/ноутбуки), верно?

правильно. Устройства Android не использовать подкачки.


почему бы не заглянуть в " настройка " исходный код приложения.

в моем Nexus 4 "Настройка" - > "приложение" - > "запуск" выглядит следующим образом.

enter image description hereenter image description here


Прежде чем начать, есть пять уровней в иерархии важности в процессе Android. это

1) Процесс,
2) видимый процесс,
3) процесс обслуживания,
4) фон процесс,
5) пустой процесс

вы можете найти более подробную информацию в документ "процессы и потоки" на сайте разработчика Android.

Я заглянул в код, и оказалось "ПОКАЗАТЬ КЭШИРОВАННЫЕ ПРОЦЕССЫ" показывает те процессы чья иерархия важности равна или ниже, чем "фоновый процесс". С другой стороны,--13--> "ПОКАЗАТЬ ЗАПУЩЕННЫЕ СЛУЖБЫ" показывает чьи иерархия важности равна "видимому процессу" или выше. Я опустил некоторые детали, чтобы ясно показать главное. Вы можете увидеть полный исходный код этой части здесь.

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 может понадобиться удаление старых процессов для восстановления памяти для новых или более важных процессов. Чтобы определить, какие процессы сохранить и какие убить, система помещает каждый процесс в "иерархию важности".

когда вкладка пользователя один из этих" кэшированных фоновых процессов", он будет отображаться сразу, как он все еще в памяти, так же, как запущенный процесс, не так ли?

право. Например, единственная причина сохранить " пустой процесс" alive-это улучшить время запуска при следующем запуске компонента.

что делает Android, когда он" кэширует " приложение?

AFAIK,его просто не убить процесс и сохранить ресурсы немедленно ответить пользователю, когда он / она возвращается.


  • пустой процесс: это процесс, используемый для кэширования неактивных компонентов Android и улучшить время запуска любого компонента
  • когда система достигает точки, в которой она нуждается чтобы высвободить ресурсы, процессы доступные для убийства будут отсортированы с учетом ранга процесса, последнего использованного процессы и запущенные компоненты.

    источник :

    Асинхронное Программирование Android-Второе Издание-Helder Vasconcelos-Июль 2016