С чем связаны ограничения на запуск Service

Ответ

Ограничения на запуск Service связаны с оптимизацией энергопотребления и работы системы, начиная с Android 8.0 (API 26).

  1. Фоновые ограничения:

    • Сервисы, запущенные в фоне (не привязанные к UI), могут быть остановлены системой.
    • Для долгих задач рекомендуется WorkManager или JobScheduler.
  2. Foreground Service:

    • Должен показывать уведомление (Notification), иначе будет IllegalStateException.
    val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()  
    startForeground(NOTIFICATION_ID, notification)  
  1. Ограничения в Android 9+:

    • Приложения в фоне не могут запускать сервисы без startForegroundService().

Используйте IntentService (устарел) или JobIntentService для фоновых задач.

Ответ 18+ 🔞

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

Первое, что надо понять — фоновые ограничения. Если твой сервис не привязан к интерфейсу и тихо себе там работает, система может его взять и накрыть медным тазом в любой момент. Просто вырубит, и всё. Ни хуя себе сюрприз, да? Для всяких долгих фоновых дел теперь в тренде WorkManager или JobScheduler. Это типа официальный способ сказать системе: «Эй, я тут важное дело делаю, не трогай».

Но если тебе прям позарез нужен именно сервис, который будет жить, то есть второй вариант — Foreground Service. Это когда твое приложение выходит на передний план, в буквальном смысле. Но и тут подвох, блядь. Ты обязан показывать уведомление! Без этого самого Notification система тебе выкинет IllegalStateException, и всё, приехали. Код простой, но без него — никуда.

val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(NOTIFICATION_ID, notification)

С девятого андроида вообще цирк начался. Если твое приложение ушло в фон, то просто так сервис не запустить. Теперь нужно использовать startForegroundService(), иначе — в пизду, не получится. Система тебе доверия ебать ноль, сразу подозревает во всяком.

Раньше-то была отдушина — IntentService. Чувак, золотой был класс. Сам себе поток создавал, сам работу делал и сам закрывался. Красота! Но его, сука, объявили устаревшим. Теперь советуют JobIntentService использовать для фоновых задач. В общем, ядрёна вошь, а не апдейты. Приходится прыгать через хуй с горы, чтобы просто файл скачать или данные синхронизировать.