1. Service 개념
안드로이드 앱 구성요소 중 하나로써 주로 백그라운드에서 오랜시간 작업을 해야할 때 사용할 수 있다.
Service는 application과 별개로 독립적인 수명 주기를 갖습니다. 따라서 애플리케이션이 종료 되거나 사용자가 다른 앱으로 전환하더라도 서비스는 대게 종료되지 않습니다.
2.Service 종류
서비스의 종류는 제공하려고 하는 기능에 따라 나뉘어지지만 만약 모든 기능이 필요하다면 동시에 실현 가능하다.
'백그라운드 서비스', '포그라운드 서비스', '바인딩 서비스' 모두 하나의 서비스에서 구현할 수 있으며
이는 앱이 제공하고자 하는 기능과 요건에 개발자가 어떤 서비스를 제공할 지 선택해야 한다.
- 백그라운드 서비스
어플리케이션이 백그라운드에서 오랫동안 작업을 수행해야 할 때 필요합니다.
예를 들어 음악 재생 앱의 경우, 사용자가 다른 앱을 사용 중이거나 화면을 끄더라도 음악은 계속해서 재생되어야 합니다. 이 경우 백그라운드에서 음악을 재생할 수 있도록 서비스를 구현할 수 있습니다. - 포그라운드 서비스
서비스가 현재 실행되고 있음을 사용자에게 알려줄 필요가 있다면 포그라운드 서비스를 사용할 수 있다.
해당 서비스는 실행과 동시에 Notification(알림)을 모바일 작업 표시줄에 띄운다. 사용자는 서비스를 제공하는 앱과 직접 상호작용하지 않고 있어도 알림을 통해 서비스 실행 유무를 알 수 있고, 여러 기능을 추가할 수도 있다.
예를 들어 음악 재생 앱의 경우, 사용자가 음악을 들을 때 작업표시줄을 통해 음악 실행 여부를 알려주고,
음악을 '실행/ 일시중지/ 종료/ 넘김' 할 수 있다.
- 바인딩 서비스
다른 애플리케이션이 서비스와 상호작용 해야할 때 서비스에 바인딩 할 수 있다.
이 때 바인딩한 애플리케이션과 서비스는 client - server의 관계를 갖는다.
클라이언트는 서비스에서 반환하는 IBinder(=cliet와 상호작용하기 위한 방법을 프로그래밍한 인터페이스)객체를
사용하여 서비스와 의사소통이 가능해진다.
예를 들어 음악 재생 앱의 경우, 사용자가 다른 앱을 사용하면서 음악을 듣는 도중에
다시 음악 재생 앱으로 돌아올 수 있다. 이 때 사용자는 현재 재생되는 음악에 대한 정보(제목, 재생 시간, 가수명)를
UI를 통해 확인할 수 있다. 이는 백그라운드에서 재생 중이던 음악에 대한 정보를 서비스가 클라이언트로 넘겨주었기 때문이다.
3.Service 수명주기
서비스의 수명주기는 두 가지('시작된 서비스', '바인드된 서비스')로 나뉘어진다.
서비스는 다른 앱의 구성요소 또는 애플리케이션으로 부터 어떻게 시작되었는지에 따라 다른 수명주기를 갖게 된다.
또한 서비스는 시작된 서비스로 시작한 뒤 바인드된 서비스를 시작할 수도 있다.
- 시작된 서비스 (Started Service)
시작된 서비스의 경우 앱의 구성요소에서 startService(intent:Intent) 메서드를 호출했을 때 시작된다.
시작된 서비스는 백그라운드에서 오랫동안 작업을 수행해야 하는 경우(=백그라운드 서비스)에 주로 사용된다.
startService() 메서드가 호출되면 서비스는 onCreate()를 호출하여 생성된 뒤,
onStartCommand() 메서드를 호출한다.
[ (다른 앱의 구성요소) : onStartService() -> (서비스) : onCreate() -> onStartCommand() ]
※ 여러번onStarteServcie()를 호출할 경우,
첫 시작을 제외하고 onCreate() 호출되지 않고 onStartCommand(intent:Intent, startId:Int) 메서드만 호출된다.
시작된 서비스는 다른 앱의 구성요소가 onStopService() 메서드를 호출하거나
서비스 스스로 stopSelf() 메서드를 호출하면 onDestroy() 메서드를 호출하며 소멸되고,
그때까지 소멸되지 않고 실행된다.
[ onStopService() or stopSelf() -> onDestroy() ]
※ 시작된 서비스의 경우 서비스가 작업을 모두 처리했을 때 서비스 종료 메서드를 호출하지 않는다면
무한히 실행될 여지가 있으므로 서비스가 적절한 시점에 반드시 종료될 수 있도록 구현하도록 한다. - 바인드된 서비스 (Bound Service)
바인드된 서비스의 경우 다른 앱의 구성요소가 bindService(intent:Intent, ServiceConnection, flag) 메서드를 호출할 때 앱의 구성요소와 서비스는 바인딩을 시작합니다. 서비스는 여러 다른 앱의 구성요소와 바인딩 될 수 있습니다.
(바인딩 되는 서비스는 이미 시작된 서비스 상태일 수도 있다.)
BindeService()가 호출되면 서비스는 onCreate()를 호출하여 생성된 뒤,
onBind(intent:Intent) : IBinder 메서드를 호출하여 IBinder 객체를 생성한다.
[ (다른 앱의 구성요소) bindService() -> (서비스) onCreate() -> onBind() ]
※ 여러 클라이언트에서 bindService()를 호출할 경우
첫 시작을 제외하고 onCreate()와 onBind()는 호출되지 않는다. IBinder 객체가 생성되고 나면
시스템은 IBinder 서비스 통신 채널을 캐싱하여 추가로 바인딩되는 클라이언트에 대해서 동일한 IBinder를 전달한다.
바인드된 서비스는 마지막 남은 클라이언트가 unBindService() 메서드를 호출하여
서비스에 바인드된 클라이언트가 존재하지 않을때 소멸된다.
[ (마지막 클라이언트) unBindService() -> if(0 == 남은 클라이언트의 수) onDestroy() ]
※ 단, 바인드된 서비스가 시작된 서비스로 실행된 경우
stopService() 또는 stopSelf() 메서드가 호출되어야 소멸된다.
이를 도식화하면 다음과 같다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android/Kotlin] 브로드캐스트 리시버(Broadcast Receiver) (1) 개념 , 리시버 생성, 리시버 선언 (0) | 2022.11.01 |
---|---|
[Android/Kotlin] Context (1) 일단 간단하게 이해해보기 (0) | 2022.06.23 |
[Android/Kotlin] Flow 흐름 (2) 예외 파악, 다른 CoroutinContext 실행, Callback 기반 API를 Flow로 변환하기. (0) | 2022.06.09 |
[Android/Kotlin] Flow 흐름 (1) 기본 개념 및 특징, 생성->수정->수집 (0) | 2022.06.06 |