Android/platform

[Android] 바인딩 서비스 (Bound Service) 란? 포그라운드 서비스와의 차이점

mins9273 2024. 12. 2. 11:04
반응형

바인딩 서비스 (Bound Service) 는 안드로이드 앱에서 클라이언트와 서비스 간에 상호작용이 필요할 때 사용하는 서비스의 한 종류입니다.

 

서비스는 기본적으로 UI 없이 백그라운드 작업을 수행하지만,

바인딩 서비스를 통해 클라이언트(액티비티 또는 다른 구성요소)와 서비스 간에 데이터를 주고받거나 메서드를 호출할 수 있습니다.

 

 

바인딩 서비스의 주요 특징

  1. 클라이언트-서비스 간 상호작용
    : 클라이언트는 바인딩 서비스를 통해 서비스의 공개 메서드에 접근할 수 있습니다.
  2. 생명주기 관리
    : 바인딩 서비스는 클라이언트가 연결되어 있는 동안에만 실행되며, 모든 클라이언트가 연결을 끊으면 서비스가 종료됩니다.
  3. 클라이언트-서비스 연결
    : bindService() 를 호출하여 클라이언트와 서비스를 연결하며, 서비스는 onBind() 를 통해 IBinder 객체를 반환합니다.

 

 

바인딩 서비스의 구현 방법

  1. 서비스 클래스 정의
    : Service 또는 Binder를 상속받아 서비스를 정의합니다.
  2. IBinder 객체 제공
    : 서비스는 클라이언트와 상호작용하기 위해 IBinder 객체를 반환해야 합니다.
  3. 클라이언트에서 서비스 연결
    : 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() : 서비스와의 연결을 해제합니다.

출처 : Android Developer

 

 

바인딩 서비스의 활용 사례

  1. 멀티미디어 재생
    예를 들어 음악 플레이어 앱에서 바인딩 서비스를 사용해 현재 재생 상태나 재생 중인 트랙 정보를 클라이언트에서 확인할 수 있습니다.
  2. 데이터 제공
    센서 데이터, GPS 위치 데이터 등 클라이언트가 주기적으로 데이터를 요청해야 할 때 유용합니다.
  3. 사용자 요청 처리
    클라이언트가 명시적으로 호출하는 작업(예: 계산, 네트워크 요청) 처리.

 

 

바인딩 서비스와 포그라운드 서비스의 차이점

바인딩 서비스와 포그라운드 서비스는 각각 서로 다른 목적과 사용 사례를 가지고 있습니다.

두 서비스는 백그라운드에서 실행되는 서비스이지만, 그 생명주기, 사용 목적, 클라이언트와의 상호작용에서 차이가 있습니다.

 

  • 바인딩 서비스 (Bound Service)
    • 목적
      • 클라이언트(액티비티 또는 다른 컴포넌트) 서비스 간의 상호작용 위해 사용됩니다.
        클라이언트가 서비스의 메서드를 호출하거나 데이터를 요청할 있게 해주며, 클라이언트가 서비스를 제어할 있도록 합니다
    • 사용 사례
      • UI와의 상호작용 필요한 서비스 (: 음악 앱에서 재생, 일시정지, 트랙 변경)
      • 센서 데이터를 읽고 다른 컴포넌트에 실시간으로 전달하는 경우
  • 포그라운드 서비스 (Foreground Service)
      • 목적
        • 시스템에서 우선순위가 높은 중요 작업 처리할 사용됩니다
          지속적인 백그라운드 작업 처리하며, 사용자에게 알림(Notification) 통해 상태를 지속적으로 알려야 합니다.
      • 사용 사례
        • GPS 추적, 음악 재생, 대용량 파일 다운로드  사용자가 실시간으로 상태를 알아야 하거나 중요한 작업이 백그라운드에서 계속 실행되어야

 

바인딩 서비스와 포그라운드 서비스의 비교

특징 바인딩 서비스 (Bound Service) 포그라운드 서비스 (Foreground Service)
목적 클라이언트와 서비스 간 상호작용 중요한 백그라운드 작업을 지속적으로 처리
사용 사례 - UI와 상호작용이 필요한 경우
- 센서 데이터 전달
- 음악 재생
- GPS 추적
- 파일 다운로드 등 지속적인 작업
생명주기 클라이언트가 연결되어 있을 때만 실행, 클라이언트가 연결을 끊으면 종료 명시적으로 종료하지 않으면 계속 실행, 앱 종료와 관계없이 실행 지속
알림 필요 없음 반드시 알림(Notification)을 표시해야 함
서비스 종료 클라이언트가 모두 연결을 끊으면 종료 명시적으로 stopForeground() 또는 stopService()를 호출해야 종료
UI와의 상호작용 클라이언트가 서비스를 제어할 수 있음 알림을 통해 사용자에게 상태를 알림, 직접적인 UI 상호작용 없음
시스템 자원 관리 클라이언트가 연결을 끊으면 자원 해제 서비스는 계속 실행되며 시스템 자원 우선순위가 높음
사용 시점 클라이언트와의 상호작용이 필요할 때 중요한 작업을 백그라운드에서 처리할 떼

 

반응형