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

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

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

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

Solutions Collecting From Web of "На Android, какая разница между запущенными процессами и кэшированными фоновыми процессами?"

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

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

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

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

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

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

Почему бы не посмотреть в исходный код приложения «Настройка» .

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

Введите описание изображения здесьВведите описание изображения здесь

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

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

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

Верно . Например, единственной причиной сохранения «пустого процесса» является улучшение времени запуска в следующий раз, когда компонент должен запускаться в нем.

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

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

Ранжирование процесса

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

Это когда ранжирование процесса входит в картину; Процессы Android оцениваются в следующих категориях: от более высокого приоритета до более низких приоритетов:

  • Процесс переднего плана: это процесс, в котором размещается действие или служба, с которыми пользователь взаимодействует: служба, запущенная на переднем плане или служба, выполняющая обратные вызовы жизненного цикла
  • Видимый процесс : это процесс, в котором размещена приостановленная деятельность или служба, ограниченная видимой деятельностью
  • Сервисный процесс: это процесс, который содержит службу, не связанную с видимой деятельностью
  • Фоновый процесс : это процесс, который содержит невидимую активность; Все фоновые процессы сортируются по списку наименее используемого (LRU), поэтому наиболее последними используемыми процессами являются последние убитые процессы, когда они
  • Пустой процесс : это процесс, используемый для кэширования неактивных компонентов Android и для улучшения времени запуска компонента

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

Источник :

Асинхронное программирование на Android – второе издание – Хелдер Васконселос – июль 2016 года