Как в Service выполнить работу не на главном потоке

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

Ответ

Для выполнения работы в Service не на главном потоке можно использовать:

  1. IntentService (устарел, но прост в использовании):
class MyIntentService : IntentService("MyIntentService") {
    override fun onHandleIntent(intent: Intent?) {
        // Работа в фоновом потоке
    }
}
  1. JobIntentService (современная замена IntentService):
class MyJobIntentService : JobIntentService() {
    override fun onHandleWork(intent: Intent) {
        // Работа в фоновом потоке
    }
}
  1. Coroutines (рекомендуемый способ):
class MyService : Service() {
    private val scope = CoroutineScope(Dispatchers.Default)

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        scope.launch {
            // Работа в фоновом потоке
        }
        return START_STICKY
    }

    override fun onDestroy() {
        scope.cancel()
        super.onDestroy()
    }
}
  1. Thread/HandlerThread (низкоуровневый подход):
val handlerThread = HandlerThread("ServiceHandler")
handlerThread.start()
val handler = Handler(handlerThread.looper)
handler.post { /* Работа в фоне */ }