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

Posted by 앱해피
2015. 6. 17. 15:31 안드로이드 이론
서비스 시작하기(Starting a service)

 

startService()를 호출함과 동시에 인텐트를 전달함으로써 액티비티나 다른 컴포넌트에서 서비스를 시작시킬 수 있다. 안드로이드 시스템에서 서비스와 관련된 onStartCommand()를 호출하고 그 메소드에 인텐트를 전달한다.(유저가 직접 onStartCommand()를 호출할 수 없다.)

 

startService()라는 메소드는 호출되자마자 반환되며, 안드로이드 시스템에서는 서비스의 onStartCommand() 메소드를 호출한다.

 

서비스가 생성된 상태가 아니었다면, 시스템은 우선 onCreate()메소드를 호출한 후에 onStartCommand()메소드를 호출한다.

 

서비스가 결속(Binding)기능을 제공하지 않는다면, 서비스로부터 특정 결과값을 전달받는 것이 불가능하다. 하지만, 결속(Binding) 기능 없이 서비스로부터 결과값을 전달받길 원한다면 브로드캐스트와 관련된 PendingIntent를 생성한 뒤에, 서비스를 시작시키는 startService()의 인자값으로 전달하면 된다. 서비스가 자신의 작업을 다 끝낸 다음에, 결과 데이터를 전달하기 위해서 브로드캐스트 기능을 이용하면 된다.

 

서비스가 시작되도록 하는 요청은 여러개가 존재할 수 있고, 그 결과 요청에 대응되는 onStartCommand() 메소드가 호출된다. 하지만, 서비스를 종료하고자 할 때는 stopSelf()나 stopService() 메소드만을 한 번 호출하면 된다.

 

 

서비스 종료하기(Stopping a service)

 

Started 서비스는 그와 관련된 라이프 사이클을 관리할 책임이 있다. 즉, 시스템에서 사용할 메모리가 부족하지 않는 한, 시스템은 현재 작동하고 있는 서비스를 절대 멈추게 하거나 종료시키지 않는다. 그렇기 때문에 서비스는 반드시 stopSelf()나 다른 컴포넌트에서 stopService()를 호출함으로써 직접 서비스를 종료 해야만 한다.

stopSelf()나 stopService()가 호출되었을 때, 시스템은 서비스를 종료시킨다.

 

하지만, 만약 서비스가 onStartCommand()라는 메소드에서 여러개의 요청을 동시다발적으로 처리하고 있을 때, 서비스에 맨 처음 들어온 요청이 끝났다고 전체 서비스를 정지시켜서는 안된다.

 

첫 번째 요청을 받은 이후에 두번째 요청을 받았을 수도 있기 때문이다.(처음 들어온 요청이 끝났다고 stopSelf()나 stopService()를 호출한다면 두 번째 요청이 처리되기도 전에 서비스가 종료될 것이다.)

 

이와 관련된 문제를 피하기 위해서, stopSelf(int)라는 함수를 호출함으로써 자신의 작업을 끝낸 서비스 요청만 종료 시킬 수 있다. stopSelf(int)라는 메소드를 호출할 때, 해당 서비스 요청과 관련된 ID값을 인자로 전달하면 된다.(ID값은 onStartCommand()에서 전달 받을 수 있다.)

 

두 번째 요청이 들어온 이후 작업을 끝낸 첫번째 요청을 stopSelf(int) 메소드로 종료한다 해도, 두 번째 요청은 첫 번째 요청과 ID값이 다르기 때문에 종료되지 않는다.

 

[주의사항]

 

서비스를 사용한는 앱을 구현할 때, 서비스가 그와 관련된 작업을 끝냈다면, 해당 서비스를 반드시 종료해야 한다. 그래야 시스템 자원을 효율적으로 운용할 수 있으며 배터리 소모도 막을 수 있다. 필요하다면, 다른 컴포넌트에서 stopService를 호출해서 서비스를 종료할 수 있다.

프로그래머가 서비스를 결속(Binding) 목적으로 사용한다고 해도, 서비스가 한번이라도 onStartCommand()가 호출됐다면 반드시 서비스를 명시적으로 종료시켜 줘야 한다.

감사합니다 ^_^