본문 바로가기
Android/Basic

Android Component : 2. Service 개요

by jaesungLeee 2021. 11. 8.

1. Service 개요

Service는 Android 4대 컴포넌트 중 하나이다. Service는 사용자와의 상호작용 없이 Background에서 장시간 수행되는 어플리케이션 구성 요소이다.

예를 들어, 우리가 Spotify에서 음악을 재생하다가 카카오톡을 실행하여도 음악은 계속 재생되고 있다. 또한, 파일을 다운로드하면서 다른 어플리케이션을 켜 다른 작업을 하고 있어도 다운로드는 중단되지 않는다. 이 예시들이 바로 Service를 사용하는 예시들이다. 또한, 이 모든 작업들은 Background에서 수행할 수 있다.

Service 특징

앞서 설명했듯이, Service는 UI 요소 없이 Background에서 장시간 수행되는 컴포넌트이다. 즉, 사용자와 직접적으로 상호작용하는 요소는 아닐뿐더러, Background에서 긴 시간 동안 실행되는 작업을 처리하기 위해 사용한다.

어떻게 보면 Background에서 작업을 처리하기 때문에 별도의 Thread가 필요한가 라고 생각할 수 있지만, 별도의 Thread는 필요하지 않다. Activity와 동일하게 Main Thread (UI Thread)에서 동작한다.


2. Service 유형

Service에는 3가지 유형이 있다.

Foreground Service

디바이스 화면에서 어떤 Service가 작동하고 있는지 사용자가 눈으로 직접 확인 가능한 Service이다. 따라서, Foreground Service는 반드시 알람(Notification)을 표시해야 한다. 또한, 이 Service는 사용자가 어플리케이션과 상호작용하지 않을 때에도 계속 실행된다.
예를 들어, 파일 다운로드 음악 재생과 같은 Service가 Foreground Service에 해당한다.

Android API 28부터는 Foreground Service를 사용하기 위해 권한을 요청해야 한다. 이 권한은 일반 수준의 권한이기 때문에 Manifest에 명시만 해놓으면 자동으로 시스템에서 허가한다.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Background Service

디바이스 화면에는 보이지 않지만 계속 실행 중인 상태 즉, 사용자에게 직접적으로 보이지 않는 작업을 수행한다.

예를 들어, 게임 업데이트 중 어플리케이션을 종료해도 업데이트가 계속되는 상태가 Background Service에 해당한다.

Android API 26부터는 Background Service 실행에 제한이 있다. Background에서 수행되고 있는 서비스가 시스템의 Resource를 많이 소모하고 있는 경우 다른 어플리케이션 사용에 있어 좋지 못한 UX를 제공하기 때문이다. 따라서, 시스템에서 Resource 부족 상태라고 판단할 경우 강제 종료될 수 있다.

Bound Service

Android Component (Activity, Service, Broadcast Receiver, Content Provider)중 하나가 bindService( )를 호출하여 해당 Service에 바인딩된 서비스 유형이다. 이는 어플리케이션과 Component가 계속 통신하다가 Service를 호출한 Activity들이 종료되면 작업이 끝나지 않아도 종료되는 형태이다.

Bound Service는 클라이언트-서버 Interface를 제공하여 Android Component가 Service와 상호작용하게 하며, 결과를 받을 수도 있다. 이는 다른 Component가 바인딩되어있는 경우에만 실행된다.

하지만, 여러 개의 Component가 Service에 한꺼번에 바인딩될 수 있지만, Component들에서 바인딩이 해제되면 해당 Service는 소멸된다.


3. Service 실행 및 생명 주기

하나의 Service는 Started Service(Foreground & Background) 방식과 Bound Service 양쪽 방식으로 작동할 수 있다. 아래와 같은 생명 주기를 갖는다.

 

Started Service는 View(Activity / Fragment)에서 startService( )를 호출하여 시작한다. startService( )는 Background에서 수행하려는 작업을 알려주는 기능으로 onStartCommand( ) 콜백을 갖는다. 이렇게 실행된 Service는 stopSelf( )로 스스로 중단하거나 또는 다른 Component가 stopService( )를 호출할 때까지 실행 상태를 유지한다.

 

Bound Service는 View(Activity / Fragment)에서 bindService( )를 호출하여 시작한다. 콜백으로는 onBind( )를 가지며 구현 시 클라이언트가 Service와 통신을 주고받기 위해 Interface를 제공해야 한다. 이렇게 바인딩된 Service는 다른 Component와 바인딩된 경우에만 실행되고, Service의 모든 바인딩이 해제되면 시스템이 소멸시킨다.

 


References

https://developer.android.com/guide/components/services

 

서비스 개요  |  Android 개발자  |  Android Developers

서비스 개요 Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 애플리케이션 구성 요소가 서비스를 시

developer.android.com

https://medium.com/mj-studio/안드로이드-어디까지-아세요-2-1-service-foreground-service-e19cf74df390

 

안드로이드, 어디까지 아세요 [2.1] — Service, Foreground Service

안드로이드 컴포넌트 Service의 이해와 구현

medium.com

 

'Android > Basic' 카테고리의 다른 글

Permissions  (0) 2021.09.04
Context  (1) 2021.08.26
Android Component : 1. Activity와 생명 주기  (0) 2021.08.24