Ответ
В Android процессы имеют разные приоритеты в зависимости от их важности. Система убивает процессы по мере необходимости, начиная с наименее важных:
- Foreground – активный процесс (Activity, Service с
startForeground(), BroadcastReceiver вonReceive()). Высший приоритет. - Visible – процесс без активного UI, но влияющий на видимый экран (например,
ServiceсonStartCommand()). - Service – фоновый сервис (
startService()), но без привязки к UI. - Cached – процессы без активных компонентов, сохранённые для быстрого запуска. Убиваются первыми при нехватке памяти.
Пример:
// Foreground Service
val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(1, notification) Ответ 18+ 🔞
А, слушай, смотри, тут про андроидные процессы надо бы разъяснить, а то народ путается, как сука в тумане. Представь, что твой телефон — это такой ёперный театр, где все приложения — актёры, а оперативка — это сцена, и места на ней, блядь, овердохуища не бывает никогда. Так вот система — это такой строгий режиссёр-пидарас, который постоянно решает, кого из актёров выгнать за кулисы, а кого оставить в кадре.
И тут, ёпта, главное — понять приоритеты, а то будешь как манда с ушами, сервис запустил, а он накрылся медным тазом через пять минут.
- Foreground (На переднем плане) — это прям король и бог, хуй с горы. Твоя активная активити, на которую ты смотришь, или, например, музыкальный плеер, который в уведомлении висит. Пока он в таком статусе — система его трогать не будет, даже если память кончится и кот сука собака. Это типа «не стреляйте в пианиста, он играет как умеет», но тут «не убивайте процесс, юзер им пользуется».
- Visible (Видимый) — чувак стоит не на сцене, а в кулисах, но его тень на сцену падает. Например, когда ты вызвал диалог поверх основного приложения. Основное приложение уже не foreground, но оно видно за этим диалогом. Его убьют только в самом крайнем случае, когда уже совсем пиздец.
- Service (Сервис) — это работяга, который где-то в подвале, в фоне, что-то делает. Музыку качает, данные синхронизирует. Но он не на виду. Система к нему уже относится с подозрением, ебать чувствую. «А нахуя он тут ресурсы жрёт, если его не видно?» — думает она. И если память поджимает, может и взъебнуть такого работягу.
- Cached (Кэшированный) — это, блядь, полные распиздяи. Приложение уже закрыто, все его активити и сервисы сдохли. Но система оставила его труп на всякий случай в быстрой памяти, чтобы если ты обратно вернёшься — оно быстрее запустилось. Это как оставить гостя спать на полу в прихожей. Как только понадобится место для важного гостя (нового приложения) — первого вышвыривают пинком под жопу. Их убивают в первую очередь, без всяких колебаний.
Вот смотри, чтобы твой сервис не стал таким вот бздуном, которого в любой момент могут прибить, его надо в форграунд возвести. Делается это просто, но хитро, через уведомление. Типа «смотрите, я важный!».
// Делаем из обычного сервиса — важную персону, Foreground
val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(1, notification) // Вот этот вызов — как бронежилет надевает
Вот после startForeground(1, notification) система смотрит на твой сервис и думает: «Ага, этот чувак не просто так в фоне сидит, у него уведомление висит, юзер про него знает. Значит, он важен. Пусть живёт». И приоритет сразу становится высшим.
А если этого не сделать — твой сервис будет как тайный любовник: вроде нужен, но при первой же опасности (нехватке памяти) от него все отрекутся и выкинут в окно. Прям доверия ебать ноль. Так что запомни: хочешь жить долго — стань форграундом, ядрёна вошь!