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

Posted by 앱해피
2015. 6. 17. 15:10 안드로이드 이론
안드로이드 서비스(Android Service) 구현하기

출처 : 안드로이드 개발자 홈페이지

 

서비스를 생성하기 위해선, Service를 상속받는 서브 클래스를 구현해야 합니다. 또한, 서비스 클래스를 구현할 때 서비스 라이프 사이클과 관련되어 호출되는 콜백 메소드를 오버라이딩 해야 하며, 안드로이드 컴포넌트가 서비스와 결속(bind)할 수 있는 메카니즘도 제공해야 합니다.

 

서비스를 구현할 때, 가장 중점적으로 구현해야 할 콜백 메소드

onStartCommand()

 

액티비티와 같은 컴포넌트가 startService()라는 메소드를 호출함으로써 서비스가 시작하도록 할 때, 시스템에서 자동으로 호출하는 메소드입니다.

 

일단 onStartCommand() 메소드가 실행되면, 서비스는 백그라운드 상태에서 계속 작동하게 됩니다.

이 메소드를 구현할 때, 서비스가 자신이 해야 할 작업을 끝냈을 때, stopSelf() 또는 stopService()를 호출함으로써 서비스가 반드시 종료될 수 있도록 해야 합니다. (결속<binding> 하기 위한 용도로만 사용하는 서비스를 사용할 때는 stopSelf()와 stopService()를 신경 쓸 필요 없습니다.)

 

onBind()

 

액티비티와 같은 컴포넌트가 bindService()라는 메소드를 호출함으로써 서비스와 결속되길 원할 때, 시스템에서 자동으로 호출하는 메소드입니다. 이 메소드를 구현할 때, IBinder를 반환해서 클라이언트와 서비스가 상호 동작할 수 있는 인터페이스를 제공해야 합니다.

 

onCreate()

 

서비스가 처음 생성될 때, 시스템은 이 메소드를 실행합니다. 보통 onStartCommand()나 onBind()가 호출 되기 전, 서비스와 관련된 각종 초기화 작업을 담당합니다. 하지만, 서비스가 이미 생성되어 있는 상황에서 이 메소드는 호출되지 않습니다.

 

onDestory()

 

서비스가 더이상 사용되지 않고 종료되어야 할 상황에서 이 메소드가 호출됩니다. 스레드, 등록된 리스너 등 그동안 서비스에서 사용했던 리소스를 해제하는 작업을 합니다.

 

안드로이드 컴포넌트가 startService()라는 메소드를 호출해서 서비스가 작동되도록 설정하면, 서비스가 자체적으로 stopSelf() 메소드를 통해서 스스로가 종료되도록 하던가 혹은 다른 컴포넌트가 stopService()를 호출함으로써 서비스를 종료시키지 않는다면 서비스는 계속 작동되는 상태가 됩니다.

 

안드로이드 컴포넌트가 서비스를 생성하기 위해 bindService()를 호출한다면, 해당 서비스는 자신과 결합된(binding) 컴포넌트가 하나라도 존재할 때까지 계속 작동됩니다. 서비스와 결합된 모든 클라이언트가 해제 되었을 때, 시스템은 그제서야 해당 서비스를 종료합니다.

 

안드로이드 시스템은 자신이 당장 사용해야 할 메모리(RAM)이 부족할 때, 서비스를 강제종료 합니다. 만약 유저가 현재 사용하고 있는 액티비티와 서비스가 결속(binding)되어 있는 상태라면, 해당 서비스가 종료될 가능성은 낮습니다. 심지어 서비스가 foreground 상태에서 동작되도록 설정한다면, 해당 서비스는 절대 종료되지 않습니다.

 

서비스를 생성할 때, 개발자는 시스템에 의해서 재시작 될 수 있도록 잘 설계해야 합니다. 시스템이 서비스를 종료시켰을 때, 시스템은 해당 서비스를 이용할 수 있는 리소스를 다시 확보했을 때 서비스를 다시 시작하게 됩니다.

 

 

매니페스트 파일에 안드로이드 서비스 선언하기

 

액티비티와 동일하게, 안드로이드 manifest파일에 사용하고자 하는 서비스를 선언해야 합니다. 서비스를 선언하기 위해서는, <application> 요소의 자식 요소로 <service> 요소를 추가해야 합니다.

<manifest ... >
  ...
  <application ... >

      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

 

<service>라는 요소에 들어갈 수 있는 속성값은 여러가지가 있지만, 그 중에서도 android:name 속성은 반드시 존재해야 합니다. 이 속성값으로 서비스로 사용할 클래스 이름을 명시해야 합니다. 개발자가 앱을 출시 했을 때, 반드시 android:name 속성값을 변경해선 안됩니다. 만약 이 속성값을 변경했을 경우에 향후 서비스를 시작하고자 혹은 서비스와 결속하고자 사용되는 인텐트는 더이상 작동될 수 있기 때문입니다.

 

안정성 높은 앱을 구현하기 위해, 서비스를 시작하거나 서비스와 결속할 때, 항상 명시적인 인텐트를 이용해야 합니다. 자신이 사용하고자 하는 서비스의 이름을 명시적으로 정함으로써, 자신이 의도하지 않았던 서비스가 실행되는 위험을 방지할 수 있기 때문입니다.

 

추가적으로, android:exported 속성의 속성값을 "false"로 지정함으로써 해당 서비스를 자신의 앱에서만 사용할 수 있습니다. 이와같이 설정함으로 해서 외부의 다른 애플리케이션이 현재 사용되고 있는 서비스를 강제로 종료할 수 없게 할 수 있습니다.

감사합니다 ^_^