Ответ
Ограничения на запуск Service связаны с оптимизацией энергопотребления и работы системы, начиная с Android 8.0 (API 26).
-
Фоновые ограничения:
- Сервисы, запущенные в фоне (не привязанные к UI), могут быть остановлены системой.
- Для долгих задач рекомендуется
WorkManagerилиJobScheduler.
-
Foreground Service:
- Должен показывать уведомление (
Notification), иначе будетIllegalStateException.
- Должен показывать уведомление (
val notification = NotificationCompat.Builder(this, CHANNEL_ID).build()
startForeground(NOTIFICATION_ID, notification)
-
Ограничения в 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 использовать для фоновых задач. В общем, ядрёна вошь, а не апдейты. Приходится прыгать через хуй с горы, чтобы просто файл скачать или данные синхронизировать.