Android Kotlin

Android Kotlin bindService LocalBinder

신농해태 2024. 9. 25. 19:28
반응형

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)

 

728x90
LIST