프로그래밍/Android

[안드로이드] 서비스(Service)에 대해 알아보자

Lou Park 2020. 10. 13. 21:10

서비스란?


서비스(Service)는 백그라운드에서 오래 실행되는 작업(long-running operations)을 위한 컴포넌트입니다. 예를 들면 파일 다운로드라던지, 데이터 체크, 데이터 처리(Processing), 음악 재생, Content Provider와의 상호작용 등에 이용될 수 있습니다.

서비스의 특징

  • 유저와 상호작용 할 수 없다.
  • 액티비티의 생명주기에 종속되어 있지않다.
  • 별도의 스레드에서 동작하지 않는다. 호스팅 프로세스의 "메인 스레드"에서 작동한다.
  • 현새 비활성화된 액티비티보다 우선순위가 높다.

  

서비스의 종류


서비스에는 여러 종류가 있습니다. 이중 Started ServiceBound 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 ServiceIBinder라는 인터페이스로 클라이언트 - 서버 관계처럼 서비스와 상호작용 할 수 있습니다. 이 같은 작업을 여러 프로세스에 걸쳐 프로세스간 통신(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