서비스란?
서비스(Service)는 백그라운드에서 오래 실행되는 작업(long-running operations)을 위한 컴포넌트입니다. 예를 들면 파일 다운로드라던지, 데이터 체크, 데이터 처리(Processing), 음악 재생, Content Provider와의 상호작용 등에 이용될 수 있습니다.
서비스의 특징
- 유저와 상호작용 할 수 없다.
- 액티비티의 생명주기에 종속되어 있지않다.
- 별도의 스레드에서 동작하지 않는다. 호스팅 프로세스의 "메인 스레드"에서 작동한다.
- 현새 비활성화된 액티비티보다 우선순위가 높다.
서비스의 종류
서비스에는 여러 종류가 있습니다. 이중 Started Service
와 Bound Service
를 나누어 설명하지만, 둘을 같이 쓸 수도 있습니다. 예를 들면 무한히 실행되는 바인드 서비스 같은거죠! 서비스를 생성시 onStartCommand()
를 사용할거냐, onBind()
를 사용할거냐로 나뉘지만 혼용가능합니다.
포그라운드 서비스 Foreground Service
Foreground Service
는 활성화된 액티비티와 동급의 우선순위를 가집니다. 그래서 시스템에 메모리가 부족하더라도 Android System에의해 종료될 확률이 적습니다. Foreground Service는 상태 바(Status bar)에 알림을 표시해야합니다. 멜론같은 음악앱을 이용하면 현재 재생중인 음악이 알림에 뜨는 걸 보셨죠? 그겁니다!
- 대부분의 경우
WorkManager
를 사용하는 것이 Foreground Service를 직접 사용하는 것보다 낫다고 합니다. WorkManager는 Jetpack에 있는 API라 나중에 따로 공부하면서 다루도록 하겠습니다.
시작된 서비스 Started Service
startService()
를 호출하여 시작하고, 한번 시작되면 따로 그만하라는 코드가 명시되어있지않다면 계속적으로 실행됩니다.
- Api level 26 이상부터는 여기에서 위치정보에 접근하는 것이 제한되어있으니 이런 경우에도 역시 WorkManager를 이용하세요.
바인딩된 서비스 Bound Service
앱에서 bindService()
를 호출하여 해당 서비스에 바인딩할 수 있게합니다. Bind Service
는 IBinder
라는 인터페이스로 클라이언트 - 서버 관계처럼 서비스와 상호작용 할 수 있습니다. 이 같은 작업을 여러 프로세스에 걸쳐 프로세스간 통신(IPC, Interprocess communication)을 수행할 수도 있습니다. 나중에 생명주기를 보면 알겠지만, Bind Service는 여기에 바인드된 컴포넌트들이 전부 바인딩이 해제되면, 서비스가 소멸됩니다.
서비스 생명주기
왼쪽의 다이어그램은 startService()
로 시작한 서비스의 것이고, 오른쪽의 다이어그램은 bindService()
로 시작한 서비스의 것입니다.
수명주기 콜백 설명
onStartCommand()
액티비티등의 다른 컴포넌트가 startService()
메소드를 통해 서비스를 시작할때 이 Callback이 호출됩니다. startService()
로 서비스를 시작했다면, 서비스 클래스 내에서 stopSelf()
또는 외부에서 stopService()
를 통해 반드시 서비스 종료를 명시해주어야만 종료됩니다. 바인딩만 구현하고 싶을때는 이 메소드를 구현하지 않아도 됩니다.
onBind()
다른 컴포넌트가 bindService()
메소드를 통해 서비스를 바인딩 할때 호출 됩니다. 만약에 이 메소드를 구현하고 싶다면 클라이언트가 이 서비스와 커뮤니케이션할때 사용할 수 있는 인터페이스인 IBinder
객체를 반환해주어야합니다. 바인딩을 사용하고 싶지 않다면, null
을 반환해주면됩니다.
onUnbind()
서비스가 제공하는 인터페이스에서 모든 클라이언트가 연결해제 되었을때 호출됩니다.
onRebind()onUnbind()
에서 연결이 끊어졌다는 알림을 받은 후 서비스에 새로운 클라이언트가 연결되었을때 호출됩니다.
onCreate()
서비스가 처음으로 onStartCommand()
나 onBind()
를 통해 생성되어질때 한번만 호출됩니다.
onDestroy()
서비스가 더이상 이용되지 않고 소멸될때 호출됩니다. onDestroy()
에서 쓰레드나, 등록된 리스너, 리시버들을 정리해야합니다.
참고한 글
https://developer.android.com/guide/components/services
https://www.vogella.com/tutorials/AndroidServices/article.html%5D
https://www.tutorialspoint.com/android/android_services.htm
'프로그래밍 > Android' 카테고리의 다른 글
잘 정리된 코틀린 코루틴 (0) | 2020.12.23 |
---|---|
[안드로이드] 예제로 알아보는 Foreground Service (0) | 2020.10.15 |
[안드로이드] Proto DataStore 사용법 (2) | 2020.10.10 |
[Android] Preferences DataStore 사용법과 개념 (0) | 2020.10.09 |
[안드로이드] FragmentStateAdapter / FragmentPagerAdapter 차이, 사용법 (0) | 2020.10.05 |