본문 바로가기
프로그래밍/Android

안드로이드 서비스 (2)

by Daniel.kwak 2019. 2. 18.

Started Service

시작된 서비스란 다른 구성요소가 startService()로 서비스를 호출하고, 서비스는 onStatCommand()에서 백그라운드 작업을 수행하는것을 말한다. 

서비스가 시작되면 서비스만의 생애주기를 가지며, 백그라운드 작업은 무기한 실행될 수 있다. 해당 서비스를 호출한 구성요소가 소멸되어도 무관하며, 서비스를 종료시킬 때는 stopSelf()를 호출하여 종료시키거나 다른 구성요소가 stopService()를 호출하여 종료시킬 수 있다. 


어플리케이션의 구성요소(액티비티)가 서비스를 시작하면서 intent를 전달하여 데이터를 전달할 수 있다. 서비스는 onStartCommand()에서 수신받는다. 

시작된 서비스는 Service와 IntentService 두 가지 클래스를 확장하여 만들 수 있다. 



1.IntentService

-Service의 서브클래스이며 작업자 쓰레드를 생성하여 서비스에 모든 요청된 작업을 하나씩 처리한다. 서비스가 여러개의 요청을 동시에 처리하지 않아도 될 때 좋은 방안이다. onHandleIntent()에서 시작 요청에 대한 인텐트를 수신하여 코드를 작성하면 된다. 

-onStartCommand()에 전달된 모든 인텐트를 실행하는 작업자 쓰레드를 생성한다. 

-한 번에 인텐트를 하나씩 onHandleIntent()의 작업 큐에 전달하므로 멀티 쓰레딩 환경에서 안전하다. 

-모든 시작 요청이 끝나고 서비스가 알아서 종료되므로, stopSelf()를 호출할 필요가 없다. 

-onBind()의 기본을 제공하며 null을 반환하도록 한다. 

-onStartCommand()를 반드시 구현해야 하며 슈퍼 구현 또한 반드시 해야 한다.(그래야 인텐트를 onHandleIntent에 전달)


2.Service

-모든 서비스의 기본 클래스이다. Service 클래스를 확장할 때는 서비스의 모든 작업을 수행할 새 스레드를 만드는것이 중요하다. 서비스가 애플리케이션의 기본 스레드를 사용하므로 서비스 작업으로 인해 성능 저하 이슈가 있을 수 있다. 

-IntentService를 확장하여 구현하면 서비스 자체가 단순해지지만, 서비스가 멀티 쓰레딩을 처리해야하는 경우 수신된 인텐트들을 구현할 수 있다.

-onStartCommand() 는 상황에 맞는 상수를 리턴해야 한다.