Можно ли сделать в новом Android, чтобы Service работал все время

«Можно ли сделать в новом Android, чтобы Service работал все время» — вопрос из категории Android компоненты, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, но с ограничениями. Начиная с Android 8.0 (API 26), работают ограничения на фоновые сервисы. Для постоянной работы нужно:

  1. Использовать startForegroundService() и показать уведомление через startForeground() в течение 5 секунд:
val intent = Intent(this, MyService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent)
} else {
    startService(intent)
}

// В сервисе:
override fun onCreate() {
    super.onCreate()
    val notification = createNotification()
    startForeground(NOTIFICATION_ID, notification)
}
  1. Для Android 9+ нужно запросить разрешение FOREGROUND_SERVICE

  2. Альтернативы:

  • WorkManager для отложенных задач
  • JobScheduler для периодических задач
  • Foreground Service с типом ServiceInfo.FOREGROUND_SERVICE_TYPE_*

Система все равно может убить сервис при нехватке памяти. Для критических задач (например, звонки) можно добавить android:stopWithTask="false" в манифесте.