Service vs IntentService

조회수 4013회

Service로는 불가능한데 IntentService로는 가능한 작업의 예시 좀 알려주실 수 있나요 (반대 상황도 포함)?

하나의 IntentService는 독립된 하나의 스레드에서 실행되며 Service는 그렇지 않다고 알고 있습니다. 그래서 Service를 자신의 스레드 안에서 실행시키는 것은 IntentService를 실행하는 것과 마찬가지라고 생각하는데요. 아닌가요?

두 가지 질문에 대해 답변해주시면 감사하겠습니다.

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    이 주제와 관련해서 Tejas Lagvankar가 괜찮은 문서를 작성한 적이 있네요. 아래는 Service와 IntentService의 핵심적인 차이점입니다.

    사용 시기

    • Service는 UI와 관련되지 않은 작업에 사용되며 수행시간이 길어선 안됩니다. 긴 작업을 수행할 필요가 있다면, 반드시 Service내에서 스레드를 사용해야됩니다.

    • IntentService는 보통 긴 작업에 사용되며 보통 메인 스레드와 상호작용하지 않습니다. 만약 메인 스레드와의 상호작용이 필요하다면, 메인 스레드 handler 혹은 broadcast intent를 사용하면 됩니다. Callback이 요구되는 상황에서도 사용됩니다(특정 작업을 시작시킬 intent).

    시작 방법

    • Service는 startService() 메소드 호출에 의해 시작됩니다.

    • IntentService는 Intent를 사용하여 시작되며, 새로운 작업 스레드를 생성하고 onHandleIntent()메소드가 이 스레드 내에서 호출됩니다.

    시작 위치

    • ServiceIntentService 모두 어떠한 스레드, 액티비티 혹은 다른 앱의 컴포넌트에서도 시작될 수 있습니다.

    동작 위치

    • Servie는 백그라운드에서 동작하며 앱의 메인 스레드에서 동작합니다.

    • IntentService는 각각의 작업 스레드에서 동작합니다.

    제한사항/단점

    • Servie는 앱의 메인 스레드를 막을 수 있습니다.

    • IntentService는 평행하게 동작하지 않습니다. 그래서 연쇄적으로 묶여있는 Intent들은 작업 스레드의 메시지 큐로 들어가서 순차적으로 실행될 것입니다.

    멈추는 시기

    • Service를 implement 하셨다면, 작업이 모두 완료 되었을 때 Service를 멈추는 것은 사용자의 몫입니다. stopSelf()나 stopService()메소드를 통해서 말이죠.(단지 binding을 제공하고 싶으시다면 이 메소드를 implement할 필요가 없습니다.)

    • IntentService는 모든 요청이 처리된 후에 Service 중지시킵니다. 그래서 굳이 stopSelf() 메소드를 호출할 필요가 없죠.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)