Операционная система Android использует различные эвристики и механизмы для определения приоритета процессов, в первую очередь основываясь на состоянии активности приложения и его компонентов.
Основные состояния приложения, влияющие на приоритет:
- Foreground (Передний план): Приложение активно взаимодействует с пользователем или выполняет видимые задачи. Это наивысший приоритет.
Примеры: Активный Activity, запущенная foreground service, привязанный Input Method.
- Visible (Видимое, но не на переднем плане): Приложение видимо пользователю, но не активно взаимодействует.
Примеры: Приложение с видимым Activity, частично перекрытым диалогом, или запущенная Bound Service.
- Service (Сервис): Приложение выполняет фоновые операции, не видимые пользователю. Приоритет ниже, чем Visible.
Примеры: Запущенная Service.
- Cached (Кэшированное): Приложение находится в памяти, но не выполняет активных задач и не видимо пользователю. Считается наименее приоритетным и может быть завершено системой для высвобождения ресурсов.
Факторы, влияющие на приоритет:
- Process state (Состояние процесса): Главный фактор. Определяется на основании компонентов приложения, которые активны в этом процессе.
- Importance (Важность): Система присваивает уровень важности каждому процессу.
- Foreground process: Наивысший приоритет. Система пытается сохранить его любой ценой.
- Visible process: Чуть ниже Foreground, но все еще высокий. Завершается только при нехватке ресурсов для Foreground процессов.
- Service process: Процесс, выполняющий
startService(). Завершается, если системе требуются ресурсы для более важных процессов.
- Cached process: Процесс, не содержащий активных компонентов. Самый низкий приоритет. Завершается при любом недостатке памяти.
- Recent usage (Последнее использование): Недавно использованные приложения имеют слегка повышенный приоритет среди процессов одного уровня важности.
- Dependencies (Зависимости): Если процесс A использует компонент из процесса B (например, Bound Service), то приоритет процесса B повышается.
Система отслеживает текущую важность каждого процесса и пытается поддерживать наиболее важные процессы в памяти. Когда требуется память, система завершает процессы в обратном порядке важности: сначала Cached, затем Service, Visible и, в крайнем случае, Foreground.
Пример:
kotlin