Расскажи про приоритет процессов

Ответ

В Android процессы имеют разные приоритеты в зависимости от их важности. Система убивает процессы по мере необходимости, начиная с наименее важных:

  1. Foreground – активный процесс (Activity, Service с startForeground(), BroadcastReceiver в onReceive()). Высший приоритет.
  2. Visible – процесс без активного UI, но влияющий на видимый экран (например, Service с onStartCommand()).
  3. Service – фоновый сервис (startService()), но без привязки к UI.
  4. Cached – процессы без активных компонентов, сохранённые для быстрого запуска. Убиваются первыми при нехватке памяти.

Пример:

// Foreground Service
val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(1, notification)

Ответ 18+ 🔞

А, слушай, смотри, тут про андроидные процессы надо бы разъяснить, а то народ путается, как сука в тумане. Представь, что твой телефон — это такой ёперный театр, где все приложения — актёры, а оперативка — это сцена, и места на ней, блядь, овердохуища не бывает никогда. Так вот система — это такой строгий режиссёр-пидарас, который постоянно решает, кого из актёров выгнать за кулисы, а кого оставить в кадре.

И тут, ёпта, главное — понять приоритеты, а то будешь как манда с ушами, сервис запустил, а он накрылся медным тазом через пять минут.

  1. Foreground (На переднем плане) — это прям король и бог, хуй с горы. Твоя активная активити, на которую ты смотришь, или, например, музыкальный плеер, который в уведомлении висит. Пока он в таком статусе — система его трогать не будет, даже если память кончится и кот сука собака. Это типа «не стреляйте в пианиста, он играет как умеет», но тут «не убивайте процесс, юзер им пользуется».
  2. Visible (Видимый) — чувак стоит не на сцене, а в кулисах, но его тень на сцену падает. Например, когда ты вызвал диалог поверх основного приложения. Основное приложение уже не foreground, но оно видно за этим диалогом. Его убьют только в самом крайнем случае, когда уже совсем пиздец.
  3. Service (Сервис) — это работяга, который где-то в подвале, в фоне, что-то делает. Музыку качает, данные синхронизирует. Но он не на виду. Система к нему уже относится с подозрением, ебать чувствую. «А нахуя он тут ресурсы жрёт, если его не видно?» — думает она. И если память поджимает, может и взъебнуть такого работягу.
  4. Cached (Кэшированный) — это, блядь, полные распиздяи. Приложение уже закрыто, все его активити и сервисы сдохли. Но система оставила его труп на всякий случай в быстрой памяти, чтобы если ты обратно вернёшься — оно быстрее запустилось. Это как оставить гостя спать на полу в прихожей. Как только понадобится место для важного гостя (нового приложения) — первого вышвыривают пинком под жопу. Их убивают в первую очередь, без всяких колебаний.

Вот смотри, чтобы твой сервис не стал таким вот бздуном, которого в любой момент могут прибить, его надо в форграунд возвести. Делается это просто, но хитро, через уведомление. Типа «смотрите, я важный!».

// Делаем из обычного сервиса — важную персону, Foreground
val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(1, notification) // Вот этот вызов — как бронежилет надевает

Вот после startForeground(1, notification) система смотрит на твой сервис и думает: «Ага, этот чувак не просто так в фоне сидит, у него уведомление висит, юзер про него знает. Значит, он важен. Пусть живёт». И приоритет сразу становится высшим.

А если этого не сделать — твой сервис будет как тайный любовник: вроде нужен, но при первой же опасности (нехватке памяти) от него все отрекутся и выкинут в окно. Прям доверия ебать ноль. Так что запомни: хочешь жить долго — стань форграундом, ядрёна вошь!