안드로이드 앱을 만들다보면, 백그라운드에서 동작하고 있는 Service와 Activity간에 인터랙션이 필요한 경우가 있습니다.
단순히 Service를 stop하고 start하며, intent로 데이터를 전달하는 것 뿐만이 아니라,
사용자의 터치등에 반응하여, Service의 메소드를 실행하고
결과를 Activity의 UI에 반영해주어야 하는 경우인데요.
오늘은 이를 가능하게 해주는 BindService를 생성하고,
Activity에서 Bind하는 방법에 대해서 정리해보겠습니다.
1. Bind 서비스 생성
Bind 서비스를 생성하기 위해서, BinderClass를 상속받아서 사용할 수도 있구요.
Messenger를 이용하는 방법도 있는데요.
같은 App이고, 같은 Process에 속해있는 Service와 Client간에는,
BinderClass를 상속받아서 Bind서비스를 생성하구요.
서로 다른 Process간에는 Messenger를 이용하는데요.
소규모 앱개발자들이 만드는 앱에서, Process간에 데이터를 주고받을 일이 많지는 않을 것 같습니다.
IPC를 위한, Messenger를 이용해서 Bind Service를 사용하는 방법은, 차후에 기회가 되면 정리해보도록 하구요.
BinderClass를 상속받아서 사용하는 방법에 대해서 정리해 보도록 하겠습니다.
1-1. LocalBinder 클래스 생성
Binder 클래스를 상속받는 LocalBinder클래스를 생성해주고,
이 클래스안에, 클라이언트가 호출할 수 있는 public 타입의 getService 메소드를 생성해줍니다.
이 메소드가 return해주는 값은 MyService의 인스턴스입니다.
1-2. 클라이언트가 받을 수 있는 IBinder객체 생성
LocalBinder클래스의 객체를 생성하여, IBinder 타입의 객체를 생성해 줍니다.
이 객체는, 클라이언트가 Service와 Bind되었을 때, onServiceConnected()콜백에서 받게 됩니다.
onBind콜백에서, 위에서 생성한 mBinder객체를 return 해 줍니다.
1-3. 클라이언트가 호출할 수 있는 public 메소드 생성
Client가 bind된 후에, 사용할 수 있도록 public 타입의 메소드를 만듭니다.
여기서는, random한 수를 return해주는 간단한 메소드를 사용하였습니다.
2. Activity에서 Bind
2-1. Connection 클래스 객체 생성 및 구현
이제, 아래와 같이 ServiceConnection객체를 생성하고,
Android Studio의 도움을 얻어서,
구현해야 할 메소드들을 implement합니다.
위에서 bind한 것에 대한 결과로,
연결이 되거나, 끊어지기도 할 텐데요.
그 상태에 대한 Callback들 입니다.
구현해야할 메소드는 아래와 같이 두가지 입니다.
메소드 이름에서 볼 수 있듯이, 하나는 서비스가 연결되었을 때이고, 다른 하나는 서비스와 연결이 끊어졌을 때입니다.
먼저, onServiceConnected부터 구현하겠습니다.
서비스에 연결이 되었고, IBinder타입의 service를 인자로 받았는데요.
service를 LocalBinder타입으로 캐스팅해서, binder 객체로 사용합니다.
이 binder객체로부터, getService 메소드를 사용하여서, service객체를 사용합니다.
mBound = true를 선언함으로써, bind되었다는 것을 정의합니다.
onServiceDisconnected에서는 mBound를 다시, false로 줍니다.
2-2. onStart()에서 bind하기
위에서 준비한 mConnection객체를 가지고,
bindService()메소드를 통해서, Service에 bind합니다.
2-3. Service의 메소드 호출하기
이제는 Service와 연결 되었으니, Service의 메소드를 호출해 볼텐데요.
User가 버튼을 클릭하면, mBound를 통해서, bind된 것을 확인하구요.
Service의 showTheNumber메소드를 사용하여서,
return해주는 값을 UI에 표시하였습니다.
3. 생명주기에 맞춘 unbindService
마지막으로 남은 것은,
생명주기에 맞추어서, unbind해주는 것인데요.
onStop()에서 unbind해주면 됩니다.
아래와 같이, 이상없이 동작하는 것을 확인할 수 있습니다.
'Android 개발 > Service, Receiver' 카테고리의 다른 글
Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기 (1) | 2023.05.23 |
---|---|
Android Foreground Service 로 Background 에서 음악 플레이 하기 (4) | 2020.01.18 |
부팅 혹은 재 부팅시 실행되는 Android Service 개발 (1) | 2019.05.26 |
Android 에서 wake lock 으로 휴대폰을 깨우자. (0) | 2017.03.23 |
댓글