반응형
바인딩 서비스 (Bound Service) 는 안드로이드 앱에서 클라이언트와 서비스 간에 상호작용이 필요할 때 사용하는 서비스의 한 종류입니다.
서비스는 기본적으로 UI 없이 백그라운드 작업을 수행하지만,
바인딩 서비스를 통해 클라이언트(액티비티 또는 다른 구성요소)와 서비스 간에 데이터를 주고받거나 메서드를 호출할 수 있습니다.
바인딩 서비스의 주요 특징
- 클라이언트-서비스 간 상호작용
: 클라이언트는 바인딩 서비스를 통해 서비스의 공개 메서드에 접근할 수 있습니다. - 생명주기 관리
: 바인딩 서비스는 클라이언트가 연결되어 있는 동안에만 실행되며, 모든 클라이언트가 연결을 끊으면 서비스가 종료됩니다. - 클라이언트-서비스 연결
: bindService() 를 호출하여 클라이언트와 서비스를 연결하며, 서비스는 onBind() 를 통해 IBinder 객체를 반환합니다.
바인딩 서비스의 구현 방법
- 서비스 클래스 정의
: Service 또는 Binder를 상속받아 서비스를 정의합니다. - IBinder 객체 제공
: 서비스는 클라이언트와 상호작용하기 위해 IBinder 객체를 반환해야 합니다. - 클라이언트에서 서비스 연결
: bindService() 메서드를 사용하여 서비스와 연결을 생성합니다.
주요 구성요소 및 코드 예제
1. 서비스 클래스 구현
MyService라는 이름의 바인딩 서비스를 구현해 보겠습니다.
class MyService : Service() {
// Binder를 통해 클라이언트에 Service 인스턴스를 제공
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): MyService = this@MyService
}
override fun onBind(intent: Intent): IBinder {
return binder
}
// 서비스의 공개 메서드
fun getRandomNumber(): Int {
return (1..100).random()
}
}
- LocalBinder : 클라이언트가 서비스 인스턴스에 접근할 수 있도록 제공하는 바인더 객체입니다.
- onBind() : 서비스가 바인딩될 때 호출되며, IBinder 객체를 반환합니다.
2. 클라이언트에서 서비스 연결
클라이언트(예: 액티비티)에서 바인딩 서비스를 사용하는 코드입니다.
class MainActivity : AppCompatActivity() {
private var myService: MyService? = null
private var isBound = false
private val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
val binder = service as MyService.LocalBinder
myService = binder.getService()
isBound = true
}
override fun onServiceDisconnected(name: ComponentName) {
myService = null
isBound = false
}
}
override fun onStart() {
super.onStart()
Intent(this, MyService::class.java).also { intent ->
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
if (isBound) {
unbindService(connection)
isBound = false
}
}
fun getRandomNumberFromService() {
if (isBound) {
val randomNumber = myService?.getRandomNumber()
Toast.makeText(this, "Random Number: $randomNumber", Toast.LENGTH_SHORT).show()
}
}
}
- ServiceConnection : 클라이언트와 서비스의 연결 상태를 관리합니다.
onServiceConnected : 서비스와 연결되었을 때 호출되며, 바인더 객체를 통해 서비스에 접근합니다.
onServiceDisconnected :서비스가 비정상적으로 연결이 끊겼을 때 호출됩니다. - bindService() : 서비스와 연결을 생성합니다.
- unbindService() : 서비스와의 연결을 해제합니다.

바인딩 서비스의 활용 사례
- 멀티미디어 재생
예를 들어 음악 플레이어 앱에서 바인딩 서비스를 사용해 현재 재생 상태나 재생 중인 트랙 정보를 클라이언트에서 확인할 수 있습니다. - 데이터 제공
센서 데이터, GPS 위치 데이터 등 클라이언트가 주기적으로 데이터를 요청해야 할 때 유용합니다. - 사용자 요청 처리
클라이언트가 명시적으로 호출하는 작업(예: 계산, 네트워크 요청) 처리.
바인딩 서비스와 포그라운드 서비스의 차이점
바인딩 서비스와 포그라운드 서비스는 각각 서로 다른 목적과 사용 사례를 가지고 있습니다.
두 서비스는 백그라운드에서 실행되는 서비스이지만, 그 생명주기, 사용 목적, 클라이언트와의 상호작용에서 차이가 있습니다.
- 바인딩 서비스 (Bound Service)
- 목적
- 클라이언트(액티비티 또는 다른 컴포넌트)와 서비스 간의 상호작용을 위해 사용됩니다.
클라이언트가 서비스의 메서드를 호출하거나 데이터를 요청할 수 있게 해주며, 클라이언트가 서비스를 제어할 수 있도록 합니다
- 클라이언트(액티비티 또는 다른 컴포넌트)와 서비스 간의 상호작용을 위해 사용됩니다.
- 사용 사례
- UI와의 상호작용이 필요한 서비스 (예: 음악 앱에서 재생, 일시정지, 트랙 변경)
- 센서 데이터를 읽고 다른 컴포넌트에 실시간으로 전달하는 경우
- 목적
- 포그라운드 서비스 (Foreground Service)
- 목적
- 시스템에서 우선순위가 높은 중요 작업을 처리할 때 사용됩니다.
지속적인 백그라운드 작업을 처리하며, 사용자에게 알림(Notification)을 통해 상태를 지속적으로 알려야 합니다.
- 시스템에서 우선순위가 높은 중요 작업을 처리할 때 사용됩니다.
- 사용 사례
- GPS 추적, 음악 재생, 대용량 파일 다운로드 등 사용자가 실시간으로 상태를 알아야 하거나 중요한 작업이 백그라운드에서 계속 실행되어야 할 때
바인딩 서비스와 포그라운드 서비스의 비교
| 특징 | 바인딩 서비스 (Bound Service) | 포그라운드 서비스 (Foreground Service) |
| 목적 | 클라이언트와 서비스 간 상호작용 | 중요한 백그라운드 작업을 지속적으로 처리 |
| 사용 사례 | - UI와 상호작용이 필요한 경우 - 센서 데이터 전달 |
- 음악 재생 - GPS 추적 - 파일 다운로드 등 지속적인 작업 |
| 생명주기 | 클라이언트가 연결되어 있을 때만 실행, 클라이언트가 연결을 끊으면 종료 | 명시적으로 종료하지 않으면 계속 실행, 앱 종료와 관계없이 실행 지속 |
| 알림 | 필요 없음 | 반드시 알림(Notification)을 표시해야 함 |
| 서비스 종료 | 클라이언트가 모두 연결을 끊으면 종료 | 명시적으로 stopForeground() 또는 stopService()를 호출해야 종료 |
| UI와의 상호작용 | 클라이언트가 서비스를 제어할 수 있음 | 알림을 통해 사용자에게 상태를 알림, 직접적인 UI 상호작용 없음 |
| 시스템 자원 관리 | 클라이언트가 연결을 끊으면 자원 해제 | 서비스는 계속 실행되며 시스템 자원 우선순위가 높음 |
| 사용 시점 | 클라이언트와의 상호작용이 필요할 때 | 중요한 작업을 백그라운드에서 처리할 떼 |
반응형
'Android > platform' 카테고리의 다른 글
| [Android] WorkManager로 백그라운드 작업 처리 (0) | 2025.04.16 |
|---|---|
| [Android] 백그라운드 서비스 (Background Service) 란? 포그라운드 서비스와의 차이점 (0) | 2024.12.02 |
| [Android] 포그라운드 서비스(Foreground Service) 개요 및 구현 방법 (1) | 2024.11.29 |
| [Android] startActivityForResult() 대신 registerForActivityResult() 사용하는 방법 (0) | 2024.11.27 |
| [Android] FCM 메시지 동작의 이해 : Notification과 Data 차이점 정리 (1) | 2024.11.25 |