Background Service — это компонент Android, предназначенный для выполнения длительных операций в фоновом режиме без пользовательского интерфейса. В отличие от Activity, Service продолжает работать даже после того, как приложение свёрнуто или пользователь переключился на другое приложение. По данным Android Developers, 2026, существует три типа сервисов: Started Service, Bound Service и Foreground Service, каждый со своим жизненным циклом и областью применения.
Главное
Background Service (или просто Service) — один из четырёх основных компонентов Android-приложения наряду с Activity, BroadcastReceiver и ContentProvider. В отличие от Activity, Service не имеет визуального интерфейса и предназначен для выполнения операций, которые должны продолжаться вне зависимости от того, находится приложение на переднем плане или нет.
Service работает в главном потоке (main thread) приложения, поэтому любые блокирующие операции внутри него требуют создания отдельного потока. Если этого не сделать, система вызовет ANR (Application Not Responding). Для простых фоновых операций Android предоставляет IntentService, который автоматически создаёт рабочий поток. В современных проектах рекомендуется использовать Kotlin-корутины с CoroutineScope внутри Service для асинхронной обработки без блокировки главного потока.
Основное назначение Service — проигрывание музыки, загрузка файлов, работа с сетевыми запросами, синхронизация данных и другие задачи, которые должны продолжаться после ухода пользователя из приложения. Однако с выходом Android 8 разработчикам приходится выбирать между типами сервисов осознанно, учитывая ограничения фоновой работы.
Service имеет собственный жизненный цикл, который отличается от Activity. Он включает четыре ключевых метода: onCreate, onStartCommand, onBind и onDestroy. Понимание этого цикла необходимо для корректной реализации фоновых задач без утечек памяти.
Метод onCreate вызывается при создании сервиса, однократно за время его жизни. В нём инициализируются ресурсы: таймеры, подключения к базе данных, сокеты. Метод onStartCommand вызывается каждый раз при вызове startService, что позволяет передавать команды уже работающему сервису. Возвращаемое значение определяет поведение системы при перезапуске.
class DownloadService : Service() {
override fun onCreate() {
super.onCreate()
initializeDownloader()
}
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
downloadFile(intent?.getStringExtra("url"))
return START_STICKY
}
override fun onBind(intent: Intent): IBinder? = null
}
onBind вызывается при привязке сервиса через bindService и возвращает объект IBinder для взаимодействия с клиентом. Этот метод используется только для Bound Service. onDestroy — последний вызов перед уничтожением сервиса. В нём освобождаются все ресурсы, остановленные потоки и отменённые задачи.
Android предлагает три типа Service, каждый из которых предназначен для своего сценария. Выбор неправильного типа может привести к нестабильной работе приложения или расходу заряда батареи.
Started Service запускается вызовом startService и работает до тех пор, пока не вызовет stopSelf или stopService. Он подходит для задач, которые должны быть выполнены немедленно: отправка аналитики, обработка изображения, загрузка одного файла. После завершения работы сервис останавливается самостоятельно.
Bound Service предоставляет клиент-серверный интерфейс, позволяя Activity, Fragment или другому компоненту взаимодействовать с сервисом. Сервис живёт, пока есть хотя бы один связанный клиент. Когда все клиенты отвязываются, сервис уничтожается. Bound Service удобен для задач, требующих двусторонней связи: музыкальный плеер, навигация.
Foreground Service — это Started Service с постоянным уведомлением в статус-баре. Система считает такой сервис активным и не убивает его даже при нехватке памяти. Foreground Service обязателен для воспроизведения музыки, записи аудио, отслеживания местоположения и других задач, важных для пользователя.
| Параметр | Started | Bound | Foreground |
|---|---|---|---|
| Запуск | startService | bindService | startForeground |
| Жизнь | до stopSelf | пока есть клиенты | до stopForeground |
| Уведомление | нет | нет | обязательно |
| Убивается | да | да | нет |
| Пример | загрузка | плеер | музыка |
Создание сервиса начинается с объявления класса, наследующего от Service, и регистрации его в AndroidManifest.xml. Без регистрации в манифесте система не сможет запустить сервис, и любой вызов startService приведёт к исключению.
// Регистрация в AndroidManifest.xml
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
startForeground(
NOTIFICATION_ID,
createNotification()
)
performSync(intent)
return START_NOT_STICKY
}
}
Для запуска сервиса из Activity или Fragment используется Intent с явным указанием класса сервиса. Начиная с Android 8, для Foreground Service обязательно требуется разрешение FOREGROUND_SERVICE в манифесте.
// Запуск Started Service
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Запуск Foreground Service (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Начиная с Android 8 (API 26) Google ввёл строгие ограничения на фоновые сервисы. Фоновый запуск Service (когда приложение не на переднем плане) разрешён только в исключительных случаях: при получении push-уведомления, после загрузки устройства или через JobScheduler.
Для длительных задач, не требующих немедленного выполнения, рекомендуется использовать WorkManager или JobScheduler. Если же приложению действительно нужен работающий сервис, единственный способ — Foreground Service с уведомлением, которое видит пользователь. Запуск сервиса без уведомления в фоне будет проигнорирован системой.
JobIntentService — это специализированный класс, который появился в support library для работы на Android 5+. Он сочетает поведение IntentService (автоматический рабочий поток, последовательная обработка) с планированием через JobScheduler. На Android 8+ JobIntentService использует JobScheduler под капотом, а на более старых версиях — обычный Service. Это позволяет единообразно обрабатывать фоновые задачи без дополнительных проверок версии Android.
class UploadJobService : JobIntentService() {
companion object {
private const val JOB_ID = 1000
fun enqueueWork(context: Context, work: Intent) {
enqueueWork(
context,
UploadJobService::class.java,
JOB_ID,
work
)
}
}
override fun onHandleWork(intent: Intent) {
val fileUri = intent.getStringExtra("file_uri")
// Выполняется в фоновом потоке
uploadFile(fileUri)
}
}
Одна из частых проблем при работе с Background Service — утечки памяти. Поскольку Service может жить дольше, чем Activity, ссылки на Activity внутри Service (через listener, callback или broadcast) приводят к невозможности сборки мусора для UI-компонентов. Рекомендуется использовать WeakReference, ViewModel или LiveData для связи Service с UI. В onDestroy обязательно отменять все подписки, останавливать потоки и закрывать курсоры.
Выбор между Background Service и WorkManager зависит от сценария. Service подходит для задач, которые должны выполняться немедленно и непрерывно: воспроизведение музыки, запись аудио, отслеживание GPS. WorkManager лучше для отложенных, гарантированных задач: синхронизация, отправка аналитики, загрузка логов. WorkManager переживёт перезагрузку устройства, а Service — нет. Service может быть Foreground с уведомлением, а WorkManager работает тихо в фоне. На практике разработчики комбинируют оба подхода: Foreground Service для критичных пользовательских задач и WorkManager для фонового обслуживания.
Android 12 ввёл флаг android:foregroundServiceType, который требует указывать тип службы: dataSync, camera, connectedDevice, location, mediaPlayback и другие. Неправильное указание типа приводит к исключению при запуске. Эта практика делает Background Service более прозрачным для пользователя и системы.
Правильная регистрация Service в манифесте включает атрибуты exported (доступность для внешних приложений), foregroundServiceType (тип фоновой службы на Android 12+) и permission. Для Bound Service также нужно объявить android:permission="android.permission.BIND_JOB_SERVICE" для JobIntentService. Без регистрации в манифесте любой вызов startService или bindService завершится исключением, поэтому проверка манифеста — первый шаг при диагностике проблем с Service.
Часто задаваемые вопросы
Service выполняется в главном потоке (UI Thread) приложения. Любая блокирующая операция внутри onStartCommand или onHandleIntent должна быть вынесена в отдельный поток или корутину, иначе система вызовет ANR через 5 секунд.
IntentService — это наследник Service, который автоматически создаёт рабочий поток и обрабатывает команды последовательно. После завершения последней задачи IntentService останавливается сам. Начиная с Android 8 IntentService считается устаревшим в пользу JobIntentService или WorkManager.
Запуск Started Service из фона на Android 12 запрещён. Исключение — Foreground Service с объявленным foregroundServiceType в манифесте и валидным уведомлением. Также разрешён короткий старт после получения высокоприоритетного FCM-сообщения.
Существует три способа: BroadcastReceiver с локальным broadcast, механизм Messenger через Handler, и LiveData/Flow в архитектуре MVVM с общим ViewModel. Для Bound Service используется IBinder с прямым вызовом методов.
Если Service был запущен с флагом START_STICKY, система перезапустит его после уничтожения процесса при нехватке памяти. Флаг START_NOT_STICKY означает, что система не будет перезапускать сервис. START_REDELIVER_INTENT аналогичен START_STICKY, но передаёт последний Intent.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также