Какие типы Service знаете?android-56

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

  • Для обработки голосовых команд

Современные альтернативы

  1. WorkManager - для отложенных фоновых задач
  2. JobScheduler - для задач по расписанию (API 21+)
  3. Coroutines + Lifecycle - для фоновых операций в UI-компонентах

Резюмируем:

  1. Started Service - для независимых фоновых задач
  2. Bound Service - для межкомпонентного взаимодействия
  3. Foreground Service - для заметных пользователю операций
  4. IntentService/JobIntentService - для последовательной обработки задач
  5. Системные сервисы - для интеграции с платформой

Выбор типа зависит от:

  • Времени выполнения задачи
  • Необходимости взаимодействия с UI
  • Версии Android
  • Видимости для пользователя