본문 바로가기
Android

[Android] Service에 대한 정리

by 너츠너츠 2023. 6. 18.

Android에서 Service란?

백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있으며, 이는 사용자가 다른 애플리케이션을 전환하더라도 백그라운드에서 계속해서 실행됩니다. 이 외에도, 구성 요소를 서비스에 바인딩하여 서비스와 상호작용할 수 있으며, 심지어는 프로세스 간 통신 (IPC)도 수행할 수 있습니다. 예를 들어 한 서비스는 네트워크 트랜잭션을 처리하고, 음악을 재생하고 파일 I/O를 수행하거나 콘텐츠 제공자와 상호작용할 수 있으며 이 모든 것을 백그라운드에서 수행할 수 있습니다.

 

 

Service 유형

서비스에는 총 3가지 타입이 존재합니다.

 

1. Foreground Service

Foreground Service는 유저에게 보이는 작업을 수행하는 서비스입니다. 예를 들어 음악을 재생하는 것이 있습니다.

Foreground Service는 반드시 Notification을 표시해야 하며, 앱을 사용하실 때 상단에 Notification이 뜬다면 Foreground 서비스일 가능성이 매우 높습니다.

 

2. Background Service

Background Service는 사용자에게 직접 보이지 않는 작업을 수행합니다. 일반적으로 비트맵 디코딩, 저장소 액세스, 머신러닝 모델 작업, 네트워크 요청 실행 등이 포함됩니다. 

 

3. Bound Service

애플리케이션 구성 요소가 bindService()를 호출하여 해당 서비스에 바인딩되면 서비스가 바인딩됩니다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있습니다. 바인딩된 서비스는 또 다른 애플리케이션 구성 요소가 이에 바인딩되어 있는 경우에만 실행됩니다. 여러 개의 구성 요소가 서비스에 한꺼번에 바인딩될 수도 있지만, 이 모든 것에서 바인딩이 해제되면 해당 서비스는 소멸됩니다.

 

위에서 다른 서비스들과 바인드 서비스를 별도로 설명했지만, 한 서비스에서 bindService()와 startService()를 전부 실행 가능합니다. 즉, startService()로 무한히 실행하게 하고, bindService()를 통해 앱의 구성 요소에서 통신할 수 있습니다. 단 이 경우 모든 구성요소에서 바인드가 해제되더라도 서비스가 종료되지 않으므로, 반드시 stopService() 혹은 stopSelf()를 통해 서비스를 종료시켜주어야 합니다.

 

Service의 생명주기

 

백그라운드 서비스

https://brunch.co.kr/@mystoryg/93 블로그에서 가져왔습니다.

startService(): 서비스를 실행한다.

onCreate(): 서비스가 최초 생성될 때 한 번 호출. 이미 실행 중인 서비스라면 이 함수는 호출X

onStartCommand(): 앱의 다른 구성 요소에서 서비스를 실행하면 이 함수가 호출. 이 함수가 호출되면 서비스가 실행된 것이며 백그라운드에서 작업을 수행

onDestrop(): 서비스가 소멸될 때 호출

stopSelf(): 서비스가 스스로 중단

stopService(): 다른 구성 요소가 서비스를 중단

 

바인드 서비스

https://brunch.co.kr/@mystoryg/93 블로그에서 가져왔습니다.

bindService(): 서비스에 바인딩할 때 사용

unbindService(): 서비스를 언바이딩할 때 사용

onBind(): 다른 구성 요소가 서비스에 바인딩되면 호출

onRebind(): (onUnbind() 함수의 리턴값이 true인 경우) unbind된 후에 서비스 실행 중일 때 다시 bind시 호출

onUnbind(): unbindService() 호출 시 호출된다.

 

(서비스를 호출한 구성 요소)

onServiceConnected(): 서비스에 바인드 되었을 때 호출

onServiceDisconnected(): 서비스를 호스팅하는 프로세스가 중단되거나 종료되어 예기치 않게 서비스에 연결이 끊어졌을 때 호출. 클라이언트가 언바인딩할 때는 호출X

 

IntentService

IntentService는 Service의 하위 클래스로, 작업자 스레드를 사용하여 모든 시작 요청을 처리하되 한 번에 하나씩 처리합니다. 서비스가 여러 개의 요청을 동시에 처리하지 않아도 되는 경우에는 최선의 옵션입니다.

https://brunch.co.kr/@mystoryg/93 블로그에서 가져왔습니다.

기본 스레드와는 별개로 onStartCommand()에 전달된 모든 인텐트 실행을 위한 작업 스레드를 생성합니다. 전달된 인텐트는 작업을 위한 큐에 순차적으로 쌓이고 루퍼에 의해서 차례로 onHandleIntent()에 전달됩니다. onHandleIntent()에서 작업이 완료되면 서비스를 종료합니다. 따라서 별도의 멀티 스레딩 처리를 고민하지 않아도 됩니다.

 

다른 함수는 오버라이딩하지 않아도 되지만 onStartCommand()는 반드시 오버라이딩을 하고 super.onStartCommand()를 호출해야 한다. 일반 서비스에 비해서는 함수가 적어 훨씬 간결합니다.

 

onStartCommand(): 인텐트를 작업 큐로 보낸 후 onHandleIntent()를 호출

onHandleIntent(): 워커 스레드에 의해 순차적으로 호출되어 필요한 작업을 수행

 

 

예시 코드

https://github.com/JGeun/Android_Study/tree/master/MusicService

 

현재는 음악 재생만 들어있지만 나중에는 Notifiaction에 제대로된 기능을 추가해보겠습니다

 

 

<참고>

https://developer.android.com/guide/components/services?hl=ko#kotlin 

https://brunch.co.kr/@mystoryg/93

https://seosh817.tistory.com/115

https://hanyeop.tistory.com/190

https://android-developer.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C13%EC%97%90%EC%84%9C-Notification-%ED%97%88%EA%B0%80-%EB%B0%9B%EA%B8%B0-%EB%B0%A9%EB%B2%95-%EB%B0%8F-%EB%B3%80%EA%B2%BD%EC%A0%90

https://jizard.tistory.com/217

반응형

댓글