본문 바로가기
안드로이드/Android

[Android] Service

by jinwo_o 2025. 4. 27.

https://developer.android.com/develop/background-work/services?hl=ko

 

서비스 개요  |  Background work  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 서비스 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Service는 백그라운드에서 장기 실행 작업

developer.android.com

Service

  • 사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소
  • 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있고, 다른 앱을 전환하더라도 백그라운드에서 계속 실행된다.
  • 앱 구성요소와 서비스를 바인딩하여 서비스와 상호작용 할 수 있고, 프로세스 간 통신(IPC)도 실행할 수 있다.
  • 예를 들어, 서비스는 백그라운드에서 네트워크 트랜잭션을 처리하거나, 음악을 재생하거나, 파일 I/O를 실행하거나, 콘텐츠 제공업체와 상호작용할 수 있다.
  • 서비스는 호스팅 프로세스의 기본 스레드에서 실행된다.
    • 서비스는 자체 스레드를 만들지 않으며 달리 지정하지 않는 한 별도의 프로세스에서 실행되지 않는다.
    • 애플리케이션 응답 없음(ANR) 오류를 방지하려면, 서비스 내에서 별도의 스레드에서 차단 작업을 실행해야 한다.
  • 서비스가 시작되었는지, 바인딩되었는지, 둘 다인지와 관계없이 모든 애플리케이션 구성요소는 Intent 로 시작하여 액티비티를 사용하는 것과 동일한 방식으로 서비스를 사용할 수 있다.
  • 서비스와 스레드 간의 선택
    • 사용자가 애플리케이션과 상호작용하는 동안에만 실행되어야 하는 작업이 있다면, 기본 스레드가 아닌 별도의 스레드를 생성하고, 이때는 다른 애플리케이션 컴포넌트의 컨텍스트를 기반으로 스레드를 만들어야 한다.

Service 종류

1. 포그라운드

  • 사용자에게 눈에 띄는 작업을 실행한다.
  • 사용자가 알아볼 수 있는 작업을 비동기식으로 실행할 수 있다.
  • 상태 표시줄 알림을 표시하여 앱이 포그라운드에서 작업을 실행하고, 시스템 리소스를 소비하고 있다는 사실을 사용자에게 알린다.
  • 사용자가 앱과 상호작용하지 않아도 계속 실행된다.
  • 앱과의 직접적인 상호작용이 없더라도 사용자가 인지할 수 있는 작업을 수행해야 할 때만 사용한다.

 

2. 백그라운드

  • 사용자가 직접 알아채지 못하는 작업을 실행한다.
  • API 26(오레오) 이상 부터는 앱이 포그라운드에 있지 않을 때 백그라운드 서비스를 강제로 종료시킨다.
    • 즉각적인 실행을 요구하는 작업에는 포그라운드 서비스를, 예약된 작업일 경우는 알림매니저, 워크매니저를 사용해야 한다.

 

3. 바인드

  • 애플리케이션 구성요소가 bindService()를 호출하여 서비스에 바인딩하면 서비스가 바인딩된다.
  • 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있다.
  • 바인딩된 서비스는 구성요소가 서비스에 바인딩되어 있는 동안만 실행된다.
  • 여러 구성요소가 한 번에 서비스에 바인딩될 수 있지만, 모든 구성요소의 바인딩이 해제되면 서비스가 소멸된다.

기본 사항

  • 서비스를 만들려면 Service 의 서브 클래스를 만들거나 기존 서브 클래스 중 하나를 사용해야 한다.
    • 구현에서는 서비스 생명 주기의 핵심 콜백 메서드를 적절히 재정의하고, 필요한 경우 다른 구성요소가 서비스에 바인드할 수 있는 메커니즘도 함께 제공해야 한다.
  • onStartCommand()
    • 시스템은 다른 구성요소가 서비스 시작을 요청할 때 startService()를 호출하여 이 메서드를 호출한다.
    • 이 메서드가 실행되면 서비스가 시작되고, 백그라운드에서 무기한 실행될 수 있다.
      • 이는 구현하는 경우, stopSelf() 또는 stopService()를 호출하여 작업이 완료되면 서비스를 중지할 책임이 있다.
    • 바인딩만 제공하려면 이 메서드를 구현할 필요는 없다.
  • onBind()
    • 시스템은 다른 구성요소가 서비스에 바인딩하려고 할 때, bindService()를 호출하여 이 메서드를 호출한다.
    • 이 메서드의 구현에서는 클라이언트가 IBinder 를 반환하여 서비스와 통신하는 데 사용하는 인터페이스를 제공해야 한다.
    • 이 메서드는 항상 구현해야 한다. 그러나 바인딩을 허용하지 않으려면 null 을 반환해야 한다.
  • onCreate()
    • 시스템은 서비스가 처음 생성될 때 onStartCommand() 또는 onBind()를 호출하기 전에 이 메서드를 호출하여 일회성 설정 프로시저를 실행한다.
    • 서비스가 이미 실행 중인 경우 이 메서드는 호출되지 않는다.
  • onDestroy()
    • 서비스가 더 이상 사용되지 않고 소멸될 때 시스템에서 이 메서드를 호출한다.
    • 서비스는 스레드, 등록된 리스너 또는 수신기와 같은 리소스를 정리하기 위해 이를 구현해야 한다.
    • 이는 서비스가 수신하는 마지막 호출이다.

 

  • 메모리가 부족하고 사용자 포커스가 있는 액티비티의 시스템 리소스를 복구해야 하는 경우에만 서비스를 중지한다.
    • 서비스가 포그라운드에서 실행되도록 선언된 경우, 거의 종료되지 않는다.
  • 서비스가 시작되고 장기 실행되는 경우, 시스템은 시간이 지남에 따라 백그라운드 작업 목록에서 서비스의 위치를 낮추고 서비스가 종료되기 쉬워진다.
    • 서비스를 시작한 경우, 시스템이 서비스를 다시 시작할 때를 대비해 적절히 처리할 수 있도록 설계해야 한다.
  • 시스템이 서비스를 종료하더라도 리소스가 사용 가능해지면 서비스를 다시 시작할 수 있으며, 이 동작은 onStartCommand()에서 반환하는 값에 따라 달라진다.

시작된 서비스 생성

  • 다른 구성요소가 startService()를 호출하여 시작하는 서비스
  • 서비스가 시작되면 이를 시작한 구성요소와는 별개인 생명 주기가 있다.
  • 구성요소는 startService()를 호출하고, 서비스를 지정하고, 서비스에서 사용할 데이터를 포함하는 Intent 를 전달하여 서비스를 시작할 수 있다.
    • 서비스는 onStartCommand() 메서드에서 이 Intent 를 수신한다.
  • onStartCommand() 메서드는 정수를 반환해야 한다. 정수는 시스템에서 서비스를 종료할 때 시스템이 서비스를 계속하는 방법을 설명하는 값이다.
    • START_NOT_STICKY : 시스템이 서비스를 onStartCommand()를 반환 후에 중단시키면 서비스를 재생성 하면 안된다. 서비스가 불필요하게 여러 개 생성되는 것을 막을 수 있다.
    • START_STICKY : 시스템이 onStartCommand() 반환 후에 서비스를 중단하면, 서비스를 자동으로 다시 생성하고 마지막 인텐트는 전달하지 않는다. 대신 Intent 로 null 을 반환한다. 단, 서비스를 시작하기 위한 보류 인텐트가 있는 경우는 예외이다.
    • START_REDELIVER_INTENT : 시스템이 onStartCommand()를 반환 후에 서비스를 중단하는 경우, 서비스를 다시 생성하고 이 서비스에 전달된 마지막 인텐트로 onStartCommand()를 호출하면 모든 보류 인텐트가 차례로 전달된다. 즉시 재개되어야 하는 작업을 수행할 때(파일 다운로드)에 적합하다.

 

서비스 시작

  • Intent 를 startService() 또는 startForegroundService()에 전달하여 다른 구성요소에서 서비스를 시작할 수 있다.
    • 앱이 API 수준 26 이상을 타겟팅하는 경우, 앱 자체가 포그라운드에 있지 않는 한 시스템은 백그라운드 서비스의 사용 또는 생성에 제한을 적용한다.
    • 앱은 포그라운드 서비스를 만들어야 하는 경우, 앱은 startForegroundService()를 호출해야 한다.
      • 이 메서드는 백그라운드 서비스를 만들지만, 메서드는 서비스가 포그라운드로 승격될 것이라고 시스템에 신호를 보낸다.
    • 서비스가 생성되면 서비스는 5초 이내에 startForeground() 메서드를 호출해야 한다.
  • 시스템은 서비스의 onStartCommand() 메서드를 호출하고 시작할 서비스를 지정하는 Intent 를 전달한다.

 

서비스 중지

  • 시작된 서비스는 자신의 생명 주기를 직접 관리해야 한다.
    • 시스템 메모리를 복구해야 하는 경우가 아니라면, 시스템에서 서비스를 중지하거나 소멸하지 않으며, onStartCommand()가 반환된 후에도 서비스가 계속 실행된다.
      • 서비스는 stopSelf()를 호출하여 스스로 중지되어야 하며, 다른 구성요소가 stopService()를 호출하여 중지할 수 도 있다.
  • 서비스가 onStartCommand()에 대한 여러 요청을 동시에 처리하는 경우, 시작 요청 처리가 완료되었을 때 서비스를 중지하면 안된다.

바인드된 서비스 생성

  • 바인드된 서비스는 구성요소가 bindService()를 호출하여 장기 연결을 만들어 서비스에 바인딩할 수 있는 서비스이다.
  • 구성요소에서 서비스와 상호작용하거나 프로세스 간 통신(IPC)을 통해 애플리케이션의 일부 기능을 다른 애플리케이션에 노출하려면 바인딩된 서비스를 만든다.
  • 바인딩된 서비스를 만들려면 onBind() 콜백 메서드를 구현하여 서비스와 통신하기 위한 인터페이스를 정의하는 IBinder 를 반환한다. 그러면 다른 구성요소가 bindService()를 호출하여 인터페이스를 가져오고 서비스에서 메서드 호출을 시작할 수 있다.
  • 서비스는 서비스에 바인딩된 구성요소를 제공하기 위해서만 유지되므로, 서비스에 바인딩된 구성요소가 없으면, 시스템에서 서비스를 소멸시킨다.
  • 클라이언트가 서비스와 상호작용을 완료하면 unbindService()를 호출하여 바인딩을 해제한다.
  • startService()로 생성된 서비스와 bindService()로 생성된 서비스를 구분하지만, 시작 방식과 관계없이 모든 서비스는 클라이언트가 서비스에 바인딩할 수 있다.
    • 예를 들어, 재생할 음악을 식별하는 Intent 를 사용하여 startService()를 호출하여 배경 음악 서비스를 시작할 수 있다. 나중에 사용자가 플레이어를 제어하거나 현재 노래에 관한 정보를 가져오려는 경우, 액티비티는 bindService()를 호출하여 서비스에 바인딩할 수 있다.
  • 서비스가 바인딩된 경우, onUnbind()가 반환되면 활성 기간이 종료된다.

 

 

https://seosh817.tistory.com/115

 

[Android] Service 정리

1. Service 란? Service는 안드로이드 4대 컴포넌트 중 하나이며 사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소 다른 애플리

seosh817.tistory.com

Service 의 콜백 메서드

바운드 서비스

  • onCreate()
  • onBind() : 안드로이드의 구성 요소가 서비스에 바인딩하고자 하는 경우, 이 메서드가 호출된다.
    • 이 메서드를 구현할 때에는 클라이언트가 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 한다. 이때는 IBinder 를 반환하면 된다.
    • 이 메서드는 항상 구현해야 하지만, 바인딩을 허용하지 않으려면 null 을 반환해야 한다.
  • onRebind() : (onUnbind() 함수의 리턴값이 true 인 경우) unbind 된 후에 서비스 실행 중일 때 다시 bind 시 호출된다.
  • onUnbind() : unBindService() Service 호출 시 true 가 호출된다.
  • bindService() : 서비스에 바인딩하고자 할 때 사용한다.
  • unBindService() : 서비스를 언바딘딩하고자 할 때 사용한다.
  • ServiceConnection 콜백 메서드
    • onServiceConnected() : 서비스에 바인드 되었을 때 호출된다.
    • onServiceDisconnected() : 서비스를 호스팅 하는 프로세스가 중단되거나 종료되어 예기치 않게 서비스에 연결이 끊어졌을 때 호출된다. 클라이언트가 언바인딩 할 때는 호출되지 않는다.

'안드로이드 > Android' 카테고리의 다른 글

[Android] JobScheduler, WorkManager  (0) 2025.04.29
[Android] MVI  (0) 2025.01.26
[Android] Clean Architecture  (0) 2025.01.22