Android Service 정리 자세하게

2023. 6. 1. 21:24android

이번 포스트에서는 Android 4대 컴포넌트 중 하나인 Service에 대해 알아보겠습니다.

Service

1.  Foreground Service
2.  Background Service
3.  Bound Service

Q. Service란 무엇인가요?

Android Service란 음악 재생, 네트워크 트랜잭션 처리, 콘텐츠 프로바이더 등과 같은 오랜 시간 걸리는 작업을 백그라운드에서 수행하는 애플리케이션 구성 요소입니다. UI가 없으며 생명주기를 가지고 있어 주기에 맞게 관리해야 합니다. 구현을 위해 Service 인터페이스를 상속받고 콜백 메서드를 구현하고 startService() 메서드를 호출하여 Service를 시작하며 stopService()를 호출하여 중지할 수 있습니다. 

 

Q. Foreground Service는 무엇인가요? 

음악 재생과 같이 사용자에게 실행 중임을 보이는 Service입니다. 알림 창에 얼마나 진행이 되었는지 표시해 알려줍니다. 

사용자에게 계속 서비스가 사용 중임을 보이므로 강제 종료 되지 않는다. 강제 종료 되지 않는다는 의미는 포그라운드 서비스가 활성화된 액티비티와 같은 순위를 가지고 있다는 의미입니다.

 

Q. 왜 foreground Service는 눈에 보이게 하나요?

Foreground Service가 눈에 보이는 이유는 Service는 기본적으로 UI가 없기 때문에 사용자가 인식하지 못할 수 있습니다. 그래서 사용자에게 현재 시스템의 자원을 소모하는 작업을 백그라운드에서 수행 중이다 알림을 통해 알려주기 위함입니다.

 

Q. Service와 Intent Service의 차이는 무엇인가요??

Service는 기본적으로 Main Thread에서 동작합니다. 그러므로 길지 않은 작업을 해야 합니다. 그래서 긴 시간을 요하는 작업을 할 경우 Service의 하위 클래스인 IntentService를 가지고 Worker Thread를 사용해 요청을 하나씩 처리할 수 있습니다. 하지만 Android 8 Oreo부터는 백그라운드 실행 제한 때문에 사용을 권장하지 않으며 11 버전 이후부터는 deprecated 이므로 사용하지 않습니다. 대신 JobIntentService를 이용할 수 있습니다.

 

Q. Background Service는 무엇인가요?

사용자에게 보이지 않는 백그라운드에서 서버에서 Contents를 다운로드한다거나 DB 작업을 하는 등의 긴 작업을 일정 시간에 수행하기 위해 UI와 무관하게 실행되는 서비스입니다. Main Thread에서 실행되므로 긴 작업을 위해 별도의 Thread 생성이 필요합니다. 이러한 경우 Worker Thread와 IntentService를 사용하여 메인 스레드와 별도로 작업을 처리할 수 있습니다. 현재는 WorkManager와 JobIntentService를 사용합니다.

 

Q.Service와 WorkManager 중에 무엇이 더 좋은가요?

현재는 WorkManager의 사용을 권장하고 있습니다. 그러므로 Workmanager를 통해 Service가 하는 기능을 구현하는 게 좋다고 생각합니다.

 

Q. 왜 WorkManager를 권장하나요?

백그라운드 작업을 실행하면 Ram 및 배터리와 같은 시스템 리소스가 소비되므로 실행 제한과 사용자 환경을 고려한 WorkManager를 백그라운드 작업에 권장하고 있습니다. 버전과 기기 등 여러 가지 정보들을 고려해서 만들기 어려움으로 이러한 것들을 처리해 주는 WorkManager를 사용하는 게 좋습니다.

 

Q. Service는 작동 시에 스레드를 생성하나요??

아닙니다. 지정하지 않는 이상 Service는 스레드를 생성하지 않고 별도의 프로세스에서 동작하지 않습니다.

 

Q. Service에서 ANR을 피하려면 어떻게 해야 하나요?

Service로 인한 ANR을 피하려면 ANR이 발생하는 작업을 별도의 Thread에서 blocking 작업을 통해 실행해야 피할 수 있습니다. IntentService를 이용한다면 작업을 처리할 수 있지만 이는 현재 Deprecated 되었으므로 JobIntentService를 사용하거나 Jetpack WorkManager의 기능을 통해 처리할 수 있습니다.

 

Q. Service와 Thread의 차이는 무엇인가요?

Service는 컴포넌트이며 생명주기를 가지고 있습니다. 또 프로세스와 무관하게 백그라운드 작업이 가능하지만 Thread는 프로세스 안에서 동작합니다. 그러므로 프로세스가 종료하면 Service는 상관없이 정해진 작업을 수행할 수 있으며 다시 시작해도 Service를 재시작할 수 있지만 프로세스에 포함된 스레드는 종료하며 재시작하지 않습니다.

 

Q. Bound(Binding) Service란 무엇인가요?

바인딩 서비스는 여러 컴포넌트에서 Service를 사용하게 해주는 Service입니다. 클라이언트-서버 인터페이스를 제공하여 여러 Component와 Service가 상호작용하게 하며 프로세스 간 통신도 수행할 수 있습니다. bindingService()를 통해 호출하고 바인딩이 해제되면 서비스는 소멸됩니다. 

 

Q. Bound Service는 왜 사용하나요?

생명 주기동안 간단한 작업만 수행하는 Started Service와 다르게 Bounding Service는 여러 컴포넌트가 복합적으로 사용할 수 있어서 더 복잡한 기능을 수행할 수 있기 때문에 사용합니다. 또한 바인딩을 통해 여러 개의 백그라운드 작업을 제어하고 여러 구성 요소들이 하나의 Service를 공유할 수 있으며 Service 간 데이터 통신과 작업을 주고받기 용이하며 같은 프로세스에서 동작하기 때문에 Overhead가 적어 경제적인 자원 사용이 가능하여 성능이 개선됩니다.

 

Q. Service의 생명주기에 대해 설명해 주세요.

service의 생명주기는 두 개로 나눌 수 있습니다. 먼저 startService로 생성된 서비스의 생명주기는 onCreate() onStartCommand(), Service Running, onDestroy, Service shut down, Unbounded Service로 진행하며, bindService()로 생성된 서비스는 onCreate(), onBind(), Clients are bound to Service, All Clients unbind by calling unbindService(), onUnbind(), onDestroy(), Service shut down Bounded service  이 중에 active lifetime은 onStartCommand() , onBind()부터 시작하며 startService는 맨 처음 한 번만 onCreate()가 호출되고 서비스가 중단되었다가 다시 실행될 때는 onStartCommand()가 호출됩니다.