<안드로이드/Android> 서비스(SERVICE) PART6

Posted by 앱해피
2015. 6. 18. 09:49 안드로이드 이론
안드로이드 서비스의 Life Cycle 알아보기

 

서비스의 라이프 사이클은 액티비티 라이프 사이클보다 훨씬 간단하다. 하지만 서비스는 유저가 인식할 수 없는 백그라운드 상태에서 동작하기 때문에 서비스가 어떻게 생성되고 제거되는지 확실하게 이해해야 한다.

[Started 서비스]

 

안드로이드 컴포넌트가 startService()를 호출할 때, Started 서비스는 생성된다. 서비스는 그 다음 무한정 동작을 하게 되고, 자신의 작업을 끝내면 stopSelf()를 호출함으로써 종료되어야 한다.

 

또한, 안드로이드 컴포넌트가 stopService()를 호출함으로써 서비스를 종료할 수 있다. 서비스가 정지되었을 때, 시스템은 해당 서비스를 종료한다.

 

[Bound 서비스]

 

안드로이드 컴포넌트(클라이언트)가 bindService()를 호출할 때, Bound 서비스가 생성된다. 컴포넌트(클라이언트)는 IBinder 인터페이스를 통해서 서비스와 상호 연동될 수 있다.

 

컴포넌트는 unbindService()를 호출하여 연결을 종료할 수 있다. 여러개의 컴포넌트가 한번에 하나의 서비스과 결속(Binding) 될 수 있으며, 모든 컴포넌트의 결속이 해제 되어야 시스템에서 해당 서비스를 종료한다.

 

Started와 Bound 서비스는 완전히 별개의 방식으로 동작하기 때문에, 사용자는 startService()에 의해서 시작된 Started 서비스에 추가로 결속(Binding)을 할 수 있다. 예를 들어, 백그라운드 음악 서비스가 startService() 함수에 의해서 호출된 상황에서, 유저는 MP3 플레이어에서 현재 재생되는 음악을 일시정지, 정지 등 제어하길 원할 수도 있고 또는 음악에 대한 정보를 얻고 싶을 수도 있다.

 

이런 경우 액티비티는 bindService()를 호출함으로써 서비스와 결속(Binding)될 수 있고, 그와 같은 기능을 서비스가 제공하는 인터페이스를 통해서 구현할 수 있다.

 

 

서비스의 Life Cycle 구현하기

 

액티비티와 유사하게, 서비스는 라이프 사이클과 관련된 콜백 메소드가 있기 때문에, 개발자는 서비스의 상태 변화를 감지할 수 있으며, 그에 따라 적절한 기능을 추가할 수 있다. 아래 그림은 서비스에서 제공하는 라이프 사이클 메소드를 보여주고 있다.

 

 

onStartCommand() onBind() onUnbind() onDestroy

 

onStartCommand() onBind() onUnbind() onDestroy

서비스의 실제 기능은 onCreate가 호출되고 난 후 onDestroy가 반환될 때까지 진행된다. 액티비티와 유사하게, onCreate 메소드에서 초기화 작업을 담당하며 onDestory 메소드에서 이제까지 사용한 리소스를 제거하는 역할을 담당한다.

 

예를 들어, 음악 재생 서비스는 onCreate() 메소드에서 음악이 재생될 스레드를 생성해야 하며, onDestroy에서 해당 스레드를 종료해야만 한다. startService()나 bindService()에 의해서 onCreate() 콜백 메소드와 onDestory() 콜백에소드는 무조건 호출된다.

 

실질적인 서비스가 진행되는 시점은 onStartCommand() 또는 onBind()가 호출되었을 때다. 이 메소드들은 startService()나 bindService()에 의해 전달된 인텐트의 처리를 담당한다.

 

서비스가 시작되고, 그와 관련된 작업을 마무리 마친뒤에 종료된다. (onStartCommand()가 호출된 이후에도 서비스는 계속 동작하는 상태다).

 

만약에 서비스가 바운드 서비스라면, 서비스를 이용하는 모든 컴포넌트에서 onUnbind()를 호출했을 때, 종료된다.

 

[주의하기] 비록 스타티드 서비스가 stopSelf()나 stopService()에 의해서 종료될지라도, 이에 대응하는 공백메소드는 제공되지 않는다. 따라서 시스템이 서비스를 종료할 때,  onDestory() 콜백 메소드만 호출되므로, 이 메소드에서 그동안 사용했던 모든 자원을 반환해주는 작업을 해야한다.

감사합니다 ^_^