1. bindService()
서비스에서 바인딩을 허용하려면 다음 두 가지가 필요하다.
ex) bindService(Intent, ServiceConnection, Context.BIND_AUTO_CREATE)
Binder
      IBinder 인터페이스를 구현한 클래스
      클라이언트와 service가 상호작용할 때 사용하는 인터페이스.
Service 클래스 코드 내에서 Binder 클래스 상속 선언
ex) inner class LocalBinder : Binder()
ServiceConnection 
      클라이언트와 service의 연결 상태를 모니터링한다.
Activity 클래스 코드 내에서 ServiceConnection 클래스 상속 선언
      ex) private val serviceConnection = object : ServiceConnection {
  
2. Binder 클래스 상속받기 
서비스를 클라이언트와 같은 앱, 프로세스에서만 사용한다면 Binder 클래스를 상속받아 사용할 수 있다. 이는 IBinder 인터페이스를 구현하는 클래스로, 클라이언트와 서비스 사이를 연결하는 인터페이스 역할을 한다. 
Binder를 사용하는 과정
1) ServiceConnection 인터페이스를 구현한다. 다음 두 콜백 메서드를 구현하는 것이 중요하다. 
onServiceConnected(name: ComponentName!, service: IBinder!): Unit 
  클라이언트와 서비스가 연결되었을 때 호출되는 콜백.
    name : 연결된 서비스 클래스의 이름
    service : 서비스의 onBind() 콜백에서 반환된 객체. 포함된 메서드 등을 사용하여 서비스와 상호작용할 수 있다.
onServiceDisconnected(name: ComponentName!): Unit 
  클라이언트와 서비스의 연결이 예상치 못하게 해제되었을 때 호출되는 콜백.
  서비스가 중지되거나 비정상 종료되었을 때 호출.
    name : 연결이 해제된 서비스 클래스의 이름.
2) 클라이언트에서 bindService()를 호출한다.
파라미터로 서비스를 시작하는 Intent와 위에서 구현한 ServiceConnection 객체를 전달해야 한다. 
bindService(service: Intent!, conn: ServiceConnection, flags: Int): Boolean 
  service : 바인딩할 서비스를 실행하는 명시적 인텐트. 
  conn : 서비스와의 연결 상태를 모니터링하는 객체. 
  flags : 바인딩 동작 옵션을 나타내는 플래그. 0 또는 Context.BIND_* 상수를 조합한 값을 사용할 수 있다. 
  Boolean : 반환값.  서비스가 존재하고 클라이언트가 바인딩될 때 요구되는 권한을 가지고 있으면 true를 반환한다. 
서비스가 존재하지 않거나 클라이언트가 바인딩될 때 요구되는 권한을 가지고 있지 않으면 false를 반환한다.
3) service에서 다음 중 하나를 만족하는 Binder 인스턴스를 생성한다. 
  클라이언트가 호출할 수 있는 공용(public) 메서드를 포함한다. 
  현재 Service 인스턴스(클라이언트가 호출할 수 있는 공용 메서드를 포함)를 반환한다. 
  서비스(클라이언트가 호출할 수 있는 공용 메서드를 포함)가 호스팅하는 다른 클래스의 인스턴스를 반환한다.
4) service의 onBind() 콜백 메서드에서 이 Binder 인스턴스가 반환된다. 
onBind(intent: Intent!): IBinder? 
  intent : 클라이언트가 service에 바인딩하기 위해 bindService()에 전달하는 인텐트. 
  IBinder : 반환값. 클라이언트와 service가 상호작용할 때 사용하는 인터페이스 
   
5) 반환된 Binder가 bindService()에 전달했던 ServiceConnection 객체의 onServiceConnected() 콜백에 전달된다.
클라이언트는 이 Binder에 포함된 메서드를 사용하여 서비스와 상호작용할 수 있다.
3. IBinder 객체를 얻는 다양한 방법
1) Binder 클래스 상속 : 앞에서 사용 설명
2) Messenger
3) AIDL (Android Interface Definition Language)
| Kotlin 다양한 함수 Lambda Single-expression (0) | 2024.10.15 | 
|---|---|
| Android Kotlin Activity 액티비티 (0) | 2024.10.15 | 
| Android Kotlin Context (3) | 2024.09.25 | 
| Android Kotlin Permission (0) | 2024.09.24 | 
| Android Kotlin Thread 와 Coroutine 과 Service (0) | 2024.09.24 | 
댓글 영역