Service vs IntentService
조회수 4013회
Service로는 불가능한데 IntentService로는 가능한 작업의 예시 좀 알려주실 수 있나요 (반대 상황도 포함)?
하나의 IntentService는 독립된 하나의 스레드에서 실행되며 Service는 그렇지 않다고 알고 있습니다. 그래서 Service를 자신의 스레드 안에서 실행시키는 것은 IntentService를 실행하는 것과 마찬가지라고 생각하는데요. 아닌가요?
두 가지 질문에 대해 답변해주시면 감사하겠습니다.
1 답변
-
이 주제와 관련해서 Tejas Lagvankar가 괜찮은 문서를 작성한 적이 있네요. 아래는 Service와 IntentService의 핵심적인 차이점입니다.
사용 시기
Service는 UI와 관련되지 않은 작업에 사용되며 수행시간이 길어선 안됩니다. 긴 작업을 수행할 필요가 있다면, 반드시 Service내에서 스레드를 사용해야됩니다.
IntentService는 보통 긴 작업에 사용되며 보통 메인 스레드와 상호작용하지 않습니다. 만약 메인 스레드와의 상호작용이 필요하다면, 메인 스레드 handler 혹은 broadcast intent를 사용하면 됩니다. Callback이 요구되는 상황에서도 사용됩니다(특정 작업을 시작시킬 intent).
시작 방법
Service는 startService() 메소드 호출에 의해 시작됩니다.
IntentService는 Intent를 사용하여 시작되며, 새로운 작업 스레드를 생성하고 onHandleIntent()메소드가 이 스레드 내에서 호출됩니다.
시작 위치
- Service 와IntentService 모두 어떠한 스레드, 액티비티 혹은 다른 앱의 컴포넌트에서도 시작될 수 있습니다.
동작 위치
Servie는 백그라운드에서 동작하며 앱의 메인 스레드에서 동작합니다.
IntentService는 각각의 작업 스레드에서 동작합니다.
제한사항/단점
Servie는 앱의 메인 스레드를 막을 수 있습니다.
IntentService는 평행하게 동작하지 않습니다. 그래서 연쇄적으로 묶여있는 Intent들은 작업 스레드의 메시지 큐로 들어가서 순차적으로 실행될 것입니다.
멈추는 시기
Service를 implement 하셨다면, 작업이 모두 완료 되었을 때 Service를 멈추는 것은 사용자의 몫입니다. stopSelf()나 stopService()메소드를 통해서 말이죠.(단지 binding을 제공하고 싶으시다면 이 메소드를 implement할 필요가 없습니다.)
IntentService는 모든 요청이 처리된 후에 Service 중지시킵니다. 그래서 굳이 stopSelf() 메소드를 호출할 필요가 없죠.
댓글 입력