Когда Service уничтожается

Ответ

Сервис уничтожается в следующих случаях:

  1. stopSelf() – сервис сам вызывает этот метод.
  2. stopService() – активность или другой компонент останавливает сервис.
  3. Система убивает сервис – при нехватке памяти (если сервис не foreground).

В onDestroy() сервиса нужно освобождать ресурсы (отписываться от событий, закрывать соединения).

override fun onDestroy() {
    super.onDestroy()
    // Освобождение ресурсов
    someManager.unregisterListener()
}

Важно:

  • Started Service уничтожается после выполнения задачи (если не вызван startForeground()).
  • Bound Service уничтожается, когда все клиенты отвязываются.

Ответ 18+ 🔞

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

Первое — самовыпил. Сервис — не дурак, он может сам сказать «всё, я закончил». Вызвал у себя метод stopSelf() и привет. Как будто сам вышел в окно, тихо и культурно.

Второе — внешняя сила. Какая-нибудь активность или другой компонент может приказать ему: «А ну-ка прекрати, сука!». Это вызов stopService(). Представь, ты слушаешь музыку, а твоя бабка с дивана кричит «выключи эту дичь!». Вот это оно и есть.

Третье — системный геноцид. Это самое весёлое. Системе память понадобилась, она смотрит: ага, тут какой-то сервис тихо себе работает, не foreground. Хуяк — и убила. Без предупреждения, без спроса. Просто взяла и прибила, как надоевшую муху. Удивление пиздец, но такова жизнь. Если хочешь выжить в этой бойне — надо стать foreground сервисом, тогда тебя будут чуть больше уважать.

И вот когда сервис всё-таки подыхает, у него есть последний шанс — метод onDestroy(). Тут, ёбана-матрешка, надо срочно всё прибрать за собой! Отписаться от всех уведомлений, закрыть сокеты, остановить потоки. А то будет тебе не сервис, а пиздопроебищная утечка памяти. Делается это так:

override fun onDestroy() {
    super.onDestroy()
    // Освобождение ресурсов
    someManager.unregisterListener() // Отписался, и спи спокойно
}

Важное замечание, блядь, на котором все спотыкаются:

  • Started Service (тот, который запустили через startService()) — он как одноразовый работяга. Сделал свою работу (скачал файл, например) — и сдох. Если, конечно, ты его не обрядил в доспехи, не вызвал startForeground() и не сделал заметным. Тогда он уже не так просто сдаётся.
  • Bound Service (тот, к которому привязываются через bindService()) — он как общажная хата. Пока есть хоть один клиент внутри (привязанный), хата живёт. Как только последний чувак вышел и отвязался — всё, хана, система руины сносит. onDestroy(), приехали.

Вот и вся философия. Либо ты сам ушёл, либо тебя выгнали, либо система придушила в угоду новой игрушке. Жестокий мир, чувак.