1. По способу запуска и взаимодействия
a) Started Service
class MyStartedService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// Выполнение задачи (например, загрузка файла)
return START_STICKY
}
override fun onBind(intent: Intent): IBinder? = null
}
Характеристики:
- Запускается явно через
startService()
- Работает до завершения задачи, даже если запустившее приложение уничтожено
- Не предоставляет интерфейс для взаимодействия
- Должен самостоятельно остановиться через
stopSelf()
Типы возвращаемых значений:
START_STICKY - перезапускается после убийства системы
START_NOT_STICKY - не перезапускается автоматически
START_REDELIVER_INTENT - перезапускается с тем же Intent
b) Bound Service
class MyBoundService : Service() {
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): MyBoundService = this@MyBoundService
}
override fun onBind(intent: Intent): IBinder = binder
}
Характеристики:
- Создает канал связи между компонентами
- Запускается через
bindService()
- Уничтожается, когда все клиенты отключаются
- Позволяет вызывать методы сервиса напрямую
2. По видимости для пользователя
a) Foreground Service
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Мой сервис")
.setSmallIcon(R.drawable.ic_notification)
.build()
startForeground(NOTIFICATION_ID, notification)
Характеристики:
- Обязано показывать Notification (с Android 8.0+)
- Имеет высокий приоритет, меньше убивается системой
- Требует разрешения
FOREGROUND_SERVICE
- Примеры: аудиоплеер, GPS-трекер
b) Background Service
Характеристики:
- Работает без уведомления
- Сильно ограничена начиная с Android 8 (Oreo)
- Альтернативы: WorkManager, JobScheduler
3. По назначению
a) IntentService
class MyIntentService : IntentService("MyIntentService") {
override fun onHandleIntent(intent: Intent?) {
// Обработка в фоновом потоке
}
}
Характеристики:
- Автоматически создает worker-поток
- Останавливается после обработки всех Intent
- В новых версиях заменен на WorkManager
b) JobIntentService
class MyJobIntentService : JobIntentService() {
override fun onHandleWork(intent: Intent) {
// Фоновая обработка
}
companion object {
fun enqueueWork(context: Context, work: Intent) {
enqueueWork(context, MyJobIntentService::class.java, JOB_ID, work)
}
}
}
4. Особые типы
a) AccessibilityService
- Для создания сервисов специальных возможностей
b) NotificationListenerService
- Для перехвата и обработки уведомлений
c) VoiceInteractionService
- Для обработки голосовых команд
Современные альтернативы
- WorkManager - для отложенных фоновых задач
- JobScheduler - для задач по расписанию (API 21+)
- Coroutines + Lifecycle - для фоновых операций в UI-компонентах
Резюмируем:
- Started Service - для независимых фоновых задач
- Bound Service - для межкомпонентного взаимодействия
- Foreground Service - для заметных пользователю операций
- IntentService/JobIntentService - для последовательной обработки задач
- Системные сервисы - для интеграции с платформой
Выбор типа зависит от:
- Времени выполнения задачи
- Необходимости взаимодействия с UI
- Версии Android
- Видимости для пользователя