devlog of ShinJe Kim

[TIL] 2019-10-21

|

Today I Learned

서비스 라이프사이클

서비스 수명주기는 아래 두 경로중 하나로 실행된다.

  1. Started Service
    • 다른 컴포넌트에서 startService()를 호출할 때 서비스가 create된다.
    • stopSelf()를 스스로 호출하여 서비스를 stop하지 않는 이상 계속 실행된다.
    • 다른 컴포넌트에서 서비스를 중지(stop)하고 싶을 시 stopService()를 호출하면 된다.
    • 서비스가 stop되면 시스템은 서비스를 destroy한다.
    • caller(클라이언트)에게 결과를 return하지 않는다.
  2. Bound Service(연결 타입의 서비스)
    • 다른 컴포넌트에서 bindService()를 호출할 때 서비스가 create된다.
    • 클라이언트는 IBinder 인터페이스를 통해 서비스와 통신한다.
    • 클라이언트는 unbindService()를 호출함으로써 연결을 close할 수 있다.
    • 다수의 클라이언트가 동일한 하나의 서비스에 bind하는 것이 가능하며,
    • 모든 클라이언트가 unbind될 때 시스템은 서비스를 destroy한다.
    • 이 서비스는 스스로 중단하지 않는다.
    • caller(클라이언트)에게 결과를 return한다.

위의 두 가지 경로는 완전히 분리된 것이 아니다. startService()로 시작된 서비스를 bind할 수도 있다.

예를 들어, 음악을 재생하게 하는 Intent로 startService()를 호출함으로써 백그라운드 음악 재생을 시작할 수 있다. 이후에 사용자가 플레이어를 제어하고 싶다거나, 현재 재생중인 음악에 대한 정보를 알고 싶다면, 액티비티는 bindService()를 호출하여 서비스를 bind할 수 있다. 이러한 경우에는, 모든 클라이언트가 unbind되기 전까지는 stopService()혹은 stopSelf()를 호출하더라도 서비스를 멈출 수 없다.

두 가지 서비스의 차이점(각각 언제 사용해야 할까?)

  • bound service: association/client/activity가 연결되어 있을때에만 실행됨. 예) 미디어 플레이어의 UI를 destroy 한다면 플레이어 service도 close됨.
  • started service: stopSelf()를 스스로 호출해야 중단됨. 예) 프린트를 할 때 우리가 프린터 앱을 닫고 나가더라도 프린트는 계속 실행됨.

출처: stackOverflo - when-is-smart-to-use-bindservice-and-when-startservice

Comments