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()가 반환된 후에도 서비스가 계속 실행된다.
- 서비스가 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 |