티스토리 뷰
이번 포스팅에서는 Bound Service 를 이용해서 Local Service를 구현하는 방법에 대해 설명한다.
Local Bound Service에 대한 설명에 앞서 Bound Service의 특징에 대해서 먼저 설명하겠다.
기존에 Stared Service에서는 서비스의 시작이라는 표현을 사용했지만 Bound Service는 라이브러리와 같은 동작방식을 갖기 때문에 서비스 연결 시작(Import의 개념..?) 이라는 표현을 사용한다.
Bound Service의 특징
1. Started Service와 다르게 Service를 실행시킨 Component와 Bound된 Service 사이에 상호작용할수있는 인터페이스가 제공된다. Started Service는 Component가 Service를 실행시키고나서는 중단시키는 것 이외의 작업을 할 수 없었지만, Bound Service는 이 인터페이스를 통해서 이외의 작업도 할 수 있다.
2. 한번에 여러개의 Component가 Bind될 수 도있고, Bind된 모든 Component가 UnBind 되면 그 때 Service가 종료된다.
3. Component가 Service에게 무언가 요청시, Service는 그에대한 처리를 마친 뒤에 Return값을 반환한다. 그러나 요청이 끝났다고 unBind 되는 것은 아니다.
4. bindService()가 호출되면 해당 Service클래스의 onBind method가 호출되며 이 method는 IBinder 객체를 반환하는데, 이 객체가 둘 사이의 인터페이스 역할을 하게된다.
기존에 Started Service를 구현할 때에는 Service 클래스에서 onStartCommand method를 사용했지만, Bound Service를 구현할 때에는 Service 클래스에서 onBind, onUnbind method를 사용한다.
Bound Service의 생명주기
구현 코드
우선 내가 연습삼아서 구현했던 코드를 살펴보자.
MyService ms = null;
Intent intent = null;
ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.myBinder mb = (MyService.myBinder)iBinder;
ms = mb.getMyService();
}
public void onServiceDisconnected(ComponentName componentName) {
ms = null;
}
}
우선 Service를 실행시킬 Component에 ServiceConnection 객체를 만들어 Service와 Connection 되었을 때 해당 Service로 부터 반환되는 IBinder를 저장하고 혹은 Service객체를 getMyService method를 통해 확보한다.
IBinder mBinder = new myBinder();
public class myBinder extends Binder {
public MyService getMyService() {
return MyService.this;
}
public MyService() {
}
public IBinder onBind(Intent intent) {
return mBinder;
}
}
이후에 Service 클래스를 생성하고 위와같이 onBind method와 myBinder 내부클래스를 선언한다.
( 우선은 그냥 이렇게 기억하는걸로 가도될것 같다. )
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
ms.plus(10, 20);
그리고 나서 Service를 실행시키는 Component에서 위와같이 Service 정보를 intent에 포함시킨 후에 bindService method를 실행시켜서 Service를 실행시키고 서로 Bind하게 된다.
ms는 내가 만든 Service객체이며, Service 클래스 내부에 plus라는 method를 내가 구현해 두었기 때문에 위와같이 사용이 가능한 것이다.
BIND_AUTO_CREATE 옵션을 주고 Bind한 상태라면, 이러한 Bind들이 모두 제거될 때까지 Service의 실행 상태를 멈출 수 없다. 따라서 당연하게도 stopService를 해도 Service의 onDestroy 생명주기 함수가 호출되지 않는다.
이러한 문제는 BIND_ADJUST_WITH_ACTIVITY 옵션을 줌으로써 해결이 가능하지만,,, 상황에 맞게 분명히 구분지어 사용할 수 있어야 하겠다.
여기서 알수 있듯이 Bound Service는 Component와 Service가 Bind되어있는 상태에서 필요할 때마다 Service의 기능을 사용/반환 하면서 진행된다는 것을 알 수 있다.
'Android > Concept' 카테고리의 다른 글
[Android] Remote Bound Service (0) | 2019.08.28 |
---|---|
[Android] Android에서 프로젝트와 프로세스 ★★★ (0) | 2019.08.28 |
[Android] IntentService (Local Service) (0) | 2019.08.20 |
[Android] startService (Local Service) (0) | 2019.08.20 |
[Android] Service (0) | 2019.08.19 |