IntentService
메인 스레드에서 Intent를 수신 한 다음 작업 패킷을 처리할 때, 이 과정이 오래 걸린다면 UI 렌더링에 영향을 미치게 됩니다.
이를 방지하기 위해 메인 스레드에서 Intent를 수신한 다음, 작업 패킷을 작업 스레드에 전달하여 처리하도록 해야 합니다.
안드로이드에는 여러 스레딩 Helper 클래스들이 있습니다.
AsyncTask는 작업 결과물을 UI에 업데이트할 때 유용하지만, 앱이 백그라운드에 있고 서비스할 UI가 없는 경우에는 별다른 도움이 되지 않습니다.
작업이 오래 걸릴 경우 HandlerThread가 더 좋을 수 있지만, Intent를 받지 못하더라도 리소스를 계속 사용해야 하기 때문에 적절하지 않습니다.
IntentService는 Service 클래스와 HandlerThread 간의 hybrid 개념입니다.
Service 클래스의 서브클래스로, HandlerThread를 내부적으로 생성합니다.
즉, Service 클래스를 기반으로 하기 때문에 Service 클래스의 기존 이점들을 가지고, HandlerThread를 이용해 Intent의 작업 패킷을 다른 스레드에서 작업할 수 있습니다.
IntentService를 이용해 알람을 통한 캐시 된 이미지를 업데이트하거나, 분석을 로깅하는 등 일정한 주기를 가지는 반복 작업을 예약할 수 있습니다.
이 경우 몇 가지 주의 사항이 있습니다.
HandlerThread 프로세스는 작업 큐(work queue)에서 작동합니다.
즉, 모든 작업이 단일 작업 큐에서 한 번에 하나씩 처리되기 때문에 한 작업을 완료하는 데 오랜 시간이 걸린다면, 대기 중인 다른 작업들은 block 됩니다.
대부분의 경우 작업 결과를 다른 스레드에 전달하기 위해 broadcast receiver를 이용합니다.
이 경우 단일 프로세스 내에서만 유효한 broadcast이면 되기 때문에, 일반적으로 쓰이는 Global broadcast 보다는 좀 더 가벼운 LocalBroadcastManager를 이용한 Local broadcast가 더 적절합니다.
이 외에 runOnUIThread를 통해 메인 스레드를 작업 결과를 전달할 수 도 있습니다.
자세한 내용은 아래 글을 참고하시기 바랍니다.
Foreground Activity이 없는 응용 프로그램은 Foreground Activity이 있는 응용 프로그램보다 종료될 수 있는 가능성이 높습니다.
IntentService는 Foreground Activity이 있는 앱과 Foreground Activity이 없는 앱 중간에 놓이기 때문에, Foreground Activity이 없는 앱보다는 종료될 가능성을 줄여주는 장점도 있습니다.
이 외에도 Intent를 얻어와 작업을 수행하기 위해 onHandleIntent()을 구현하기만 하는 편리성도 있습니다.
첫 이직 면접, 첫 질문이 IntentService 이였습니다.
다행히 조금 아는 수준?이라 잘 답변했는데 공부해보니 더 많은 내용이 있었네요.
자세한 내용은 아래 내용들 참고해주시기 바랍니다.