공부/안드로이드

[안드로이드] 서비스(Service)

ghhong 2021. 9. 10. 11:20

서비스란?

● Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 컴포넌트이며 사용자 인터페이스를 제공하지 않습니다.

● 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있으며, 이는 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 계속해서 실행됩니다.

● 컴포넌트를 서비스에 바인딩하여 서비스와 상호작용할 수 있으며, 프로세스 간 통신(IPC)도 수행할 수 있습니다.

 

서비스 유형

● 포그라운드 서비스

    ○ 포그라운드 서비스는 사용자에게 보이는 작업을 수행합니다. 오디오 앱이라면 오디오 트랙을 재생할 때 포그라운드 서비스를 사용합니다. 포그라운드 서비스는 알림을 표시해야 합니다. 포그라운드 서비스는 사용자가 앱과 상호작용하지 않을 때도 계속 실행됩니다.

● 백그라운드 서비스

    ○ 백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행합니다. 시스템 리소스가 부족할 경우 강제 종료될 수 있다.

● 바인드 서비스

    ○ 서비스와 서비스를 호출하는 앱 구성 요소가 서버-클라이언트와 같은 형태로 상호작용한다. 즉, 여러 프로세스에서 같은 서비스에 바인딩하여 작업할 수 있다. 바인딩 된 모든 프로세스에서 바인딩이 해제되면 서비스는 소멸됩니다.

 

서비스 생명주기

서비스 수명 주기 : https://developer.android.com/guide/components/services?hl=ko

왼쪽의 다이어그램은 서비스가 startService()로 생성된 경우의 수명 주기를 나타내며 오른쪽의 다이어그램은 서비스가 bindService()로 생성된 경우의 수명 주기를 나타낸다.

 

백그라운드 서비스

백그라운드 서비스 : https://brunch.co.kr/@mystoryg/93

startService()로 최초 서비스 실행시 onCreate()가 호출된다. 이후에 onStartCommand()가 호출된다. 서비스를 종료하기 위해서는 서비스를 호출한 곳에서 stopService()를 실행하거나 서비스 자체에서 stopSelf()를 실행한다. 그 이후에 onDestroy()가 호출되어 서비스가 종료된다.

 

주요 함수

startService() : 구성 요소(예: 액티비티)가 서비스를 시작하도록 요청하는 경우 호출된다.

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

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

onDestroy() : 서비스가 소멸될 때 호출된다.stopSelf() : 서비스가 스스로 중단한다.

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

 

바인딩 서비스

바인딩 서비스 : https://brunch.co.kr/@mystoryg/93#comment

bindService()를 통해 최초 바인드 할 때 onCreate()가 실행된다(바인딩된 서비스는 일반적으로 startService()를 호출하더라도 구성 요소가 서비스를 시작하도록 허용하지 않습니다). 그 후에는 onBind()가 호출된다. 서비스를 호출한 쪽에서 바인드를 해제하기 위해서는 unbindService()를 실행한다. 그러면 서비스에서 onUnbind()가 실행되고, 바인드 되어있던 모든 구성 요소가 바인드를 해제하면 onDestroy()가 실행되어 서비스가 종료된다.

 

주요 함수

bindService() : 구성 요소가 서비스에 바인딩되고자 할 때 사용한다.

onBind() : 다른 구성 요소가 서비스에 바인딩되면 호출된다. 이 메서드를 구현할 때에는 클라이언트가 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 합니다. 이때 IBinder를 구현하여 반환하면 됩니다.클라이언트가 IBinder를 수신하면 해당 인터페이스를 통해 서비스와 상호작용합니다. 이 메서드는 항상 구현해야 하지만, 바인딩을 허용하지 않으려면 null을 반환해야 합니다.

 

unbindService() : 클라이언트가 서비스를 언바인딩 할 때 사용한다. 서비스에 바인딩된 클라이언트가 하나도 없으면 시스템이 해당 서비스를 소멸시킨다.

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

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

 

인텐트서비스

인텐트 서비스 : https://brunch.co.kr/@mystoryg/93#comment

기본 스레드와는 별개로 onStartCommand()에 전달된 모든 인텐트 실행을 위한 작업 스레드를 생성한다. 전달된 인텐트는 작업을 위한 큐에 순차적으로 쌓이고 루퍼에 의해서 차례로 onHandleIntent()에 전달된다. onHandleIntent()에서 작업이 완료되면 서비스를 종료한다. 따라서 별도의 멀티 스레딩 처리를 고민하지 않아도 된다(멀티 스레딩을 수행해야 하는 경우 Service클래스를 확장하여 각 인텐트를 처리하게 할 수 있다). onBind()의 기본 구현을 제공하여 null을 반환한다.(서비스가 바인드를 허용하는 경우에만 구현한다.)

 

주요 함수

onStartCommand() : 인텐트를 작업 큐로 보낸 후 onHandleIntent()를 호출한다. 반드시 기본 구현을 반환해야 한다.

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

 

출처 : 

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

 

안드로이드 서비스(Service)

4대 컴포넌트 | 안드로이드 서비스 서비스는 백그라운드에서 동작하는 작업을 수행한다. 따라서 서비스를 실행한 앱을 다른 앱으로 전환하더라도 서비스에서 시작한 작업은 백그라운드에서 계

brunch.co.kr

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

 

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

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

developer.android.com

감사합니다.