На Android, какая разница между запущенными процессами и кэшированными фоновыми процессами?
В Android, когда я смотрю в "Настройка" → "Приложение", под вкладкой "running" я вижу, что память разрезается на части: "используемая память" и "свободная память", а также приложения либо помещаются в "используемую память", либо "свободную память". Приложения в разделе "Свободная память" отмечены как "кэшированный фоновый процесс".
Итак, что такое "кэшированные фоновые процессы"? Они все еще находятся в памяти, а не переключаются на "диск" (как это делают настольные компьютеры/ноутбуки), правильно? Когда пользователь вводит один из этих "кэшированных фоновых процессов", он будет отображаться сразу же, поскольку он все еще находится в памяти, как и текущий процесс, правильно?
Что делает Android, когда он "кэширует" приложение?
Ответы
Ответ 1
Итак, что такое "кэшированные фоновые процессы" ?
Поскольку вы запрашиваете техническую интерпретацию чего-либо, указанного в пользовательском интерфейсе устройства, определение может отличаться в зависимости от устройства, если производители устройств решили переделать приложение "Настройки".
Как говорится, "кэшированные фоновые процессы" обычно относятся к процессам, которые не имеют активности переднего плана и не имеют текущей службы. Эти процессы хранятся в памяти просто потому, что у нас достаточно памяти для этого, и поэтому, как вы заметили, пользователь может быстро вернуться к этим процессам. Поскольку Android начинает нуждаться в большей системной памяти для других процессов, "кэшированные фоновые процессы" , как правило, являются процессами, которые заканчиваются для освобождения оперативной памяти системы.
Приоритетным примером "кэшированного фонового процесса" будет тот, в котором пользователь запустил приложение, коротко щелкнул его, а затем нажал HOME, чтобы вернуться на главный экран. Если у процесса нет работающего сервиса, я ожидаю, что он будет указан как "кэшированный фоновый процесс".
Они все еще находятся в памяти, а не переключаются на "диск" (как это делают настольные компьютеры/ноутбуки), правильно?
Правильно. Устройства Android не используют пространство подкачки.
Ответ 2
Почему бы не заглянуть в "Настройка" исходного кода приложения.
В моем Nexus 4 "Настройка" → "Приложение" → "Запуск" выглядит ниже.
![enter image description here]()
![enter image description here]()
Перед началом работы в иерархии важности в Android-процессе есть пять уровней. Это
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 может потребоваться удалить старые процессы для восстановления памяти для новых или более важных процессов. Чтобы определить, какие процессы сохранить и что убить, система помещает каждый процесс в "иерархию важности".
Когда пользователь вставляет один из этих "кешированных фоновых процессов", он будет отображаться сразу же, поскольку он все еще находится в памяти, точно так же, как работает процесс?
Right. Например, единственная причина для сохранения "пустого процесса" в том, чтобы улучшить время запуска при следующем запуске компонента.
Что делает Android, когда он "кэширует" приложение?
AFAIK, он просто не убивает процесс и не позволяет ресурсам немедленно отвечать на Пользователь, когда он/она возвращается.
Ответ 3
Ранги процесса
Операционная система Android пытается поддерживать приложение, работающее в течение длительного времени
насколько это возможно, но когда доступная память низкая, она попытается освободить ресурсы в
системы, убивая процессы с меньшим значением frst.
Это когда ранжирование процесса входит в картину; процессы Android
ранжируются в следующих категориях от более высокого приоритета до более низких приоритетов:
- Процесс переднего плана. Это процесс, в котором размещается действие или служба, которые
пользователь в настоящее время взаимодействует с: службой, запущенной на переднем плане или
сервис, выполняющий обратные вызовы жизненного цикла
- Видимый процесс. Это процесс, на котором размещена приостановленная деятельность или служба
ограниченный видимой деятельностью.
- Сервисный процесс: это процесс, в котором размещается служба, не связанная с
видимая активность
- Фоновый процесс. Это процесс, который содержит невидимую активность; все
фоновые процессы сортируются по списку наименее используемого (LRU)
поэтому последними использованными процессами являются последние убитые процессы, когда
они
- Пустой процесс. Это процесс, используемый для кэширования неактивных компонентов Android.
и улучшить время запуска компонента
Когда система достигает точки, требующей освобождения ресурсов, процессы
доступные для убийства, будут отсортированы с учетом ранга процесса, последнего использования
процессов и компонентов.
Источник:
Асинхронное программирование на Android - второе издание - Helper Vasconcelos - июль 2016 года