Ответ
Foreground Service требует уведомления, что повышает прозрачность для пользователя, но гарантирует работу приложения в фоне даже при ограничениях системы (начиная с Android 8+). Обычные сервисы могут быть убиты системой для оптимизации ресурсов, особенно в Doze Mode или App Standby.
Пример объявления Foreground Service:
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Service running")
.setSmallIcon(R.drawable.ic_notification)
.build()
startForeground(1, notification)
Ключевые отличия:
- Видимость: Foreground Service всегда показывает уведомление.
- Приоритет: Система реже убивает Foreground Service.
- Ограничения: Обычные сервисы не работают в фоне на Android 9+ без foreground.
Используйте обычные сервисы для кратковременных задач, Foreground — для длительных (музыка, GPS, загрузки).
Ответ 18+ 🔞
Давай разжую тебе эту тему, как будто объясняю соседу, который пытается на старом телефоне музыку слушать, а она вырубается. Ситуация, в общем, знакомая до овердохуища.
Смотри, есть у тебя в приложении фоновые задачи. Типа, музыка играет или файл качается. Так вот, система Андроид, особенно начиная с восьмой версии, стала хитрой жопой. Она экономит батарейку и режет всё, что работает в фоне без спроса. Просто берёт и прибивает твой сервис, как назойливую муху. И стоишь ты потом с выпученными глазами: «Ёпта, а где мой трек?».
Вот чтобы этого не было, придумали Foreground Service. Суть проста, как три копейки: ты говоришь системе — «Э, сабака сука, я тут важным делом занят, не мешай!». А в качестве пропуска ты показываешь пользователю уведомление. Типа, «Чувак, я тут у тебя музыку в фоне кручу, вот смотри, иконка висит». Прозрачность полная, пользователь в курсе, что что-то работает, и система уже не так рвётся этот процесс прикончить. Это как повесить на дверь табличку «Идёт запись» — уже не зайдёшь просто так.
А обычный сервис — это как пытаться в тихушку под одеялом сериал смотреть. Пока не шевелишься, вроде норм. Но как только система уходит в глубокий сон (этот их Doze Mode) или решает, что приложением давно не пользовались, она без зазрения совести накрывает твой сервис медным тазом. И всё, тишина.
Вот смотри, как это выглядит в коде. Чтобы поднять сервис в «форграунде», надо ему вручить эту самую бумажку-уведомление:
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Service running")
.setSmallIcon(R.drawable.ic_notification)
.build()
startForeground(1, notification)
Всё. Вызвал startForeground — и ты теперь важная птица, система тебя будет гонять по фоне куда реже.
Короче, резюмирую на пальцах:
- Видимость: Foreground Service — это как работать в свете софитов. Уведомление висит, все видят. Обычный сервис — это тёмная комната, где тебя в любой момент могут схватить за шкирку.
- Живучесть: Форграунд-сервису система доверяет больше, убивает его в самом крайнем случае. Обычный — на расход, прибили и даже не вспомнили.
- Ограничения: На современных Андроидах (где-то с девятки) обычный сервис просто нихуя не сделает в фоне, если его не вывести на передний план. Это как закон: хочешь работать в тихом фоне — плати уведомлением.
Так что выбирай, как у тебя дела обстоят. Нужно на пять секунд синхронизировать данные — бери обычный сервис. Запускаешь трек на час или везешь навигатор — однозначно Foreground Service, без вариантов. Иначе пользователь тебе такое устроит, что мало не покажется.