티스토리 뷰

Android/Concept

[Android] Remote Bound Service

ch4njun 2019. 8. 28. 22:56
반응형

이 포스트를 읽기전 반드시 이전 포스트 "패키지와 프로세스"를 읽길 바란다.

https://ch4njun.tistory.com/100

 

[Android] Android에서 프로젝트와 프로세스 ★★★

 

ch4njun.tistory.com

 

앞서 설명했던 Service중에서 마지막으로 Remote Bound Service에 대해 설명하겠다.

 

기존에 내가 계속계속 이해가 안됐던 부분은, Remote Bound Service는 서로 다른 Process에서 동작하는 Service에 Component가 Bound 되어서 해당 Service의 기능을 사용한다는 것인데, 그러면 하나의 Package에는 Activity, 또 다른 Package에는 Service를 구현한 상태로 진행이 가능하다는 뜻인건데 왜 도대체 예제가 하나도 제대로 동작을 안하는지 이해가 안됐었다.

 

그러나 앞서 말했던 포스트에서 정리했듯이 꼭 Package가 분리되어야 다른 Process상에서 동작하는 것이 아니라 AndroidManifest.xml에 :remote 설정을 해줌으로써 Service를 다른 Component들과 다른 Process상에서 동작 시키는 것이 가능하다.

 

그리고 이 때 서로 다른 Process에서 동작하는 Service에 Bound하고 사용하는 것을 Remote Bound Service라고 한다. 그러나 서로 다른 Package에 존재한 상태로도 가능은 하다고 하는데, 방법을 찾진 못했다.

 

그러면 Remote Bound Service를 어떻게 구현하는지 살펴본다.

사실 AIDL을 사용해 구현하는 방법도 있는데, 안드로이드에서 지향하는 Messenger을 사용했다.

 


구현 코드

우선 Service를 사용하는 Component쪽의 구성이다.

 

해당 Component쪽에 핸들러를 만들어 주고, 이 핸들러를 통해 Messenger 객체를 생성한다.

위 과정은 Service쪽에서 이 Component쪽으로 응답값(?)을 보내거나, 서로 상호작용을 하기위해 필요하다. 위 과정을 생략할수도 있는데 그럴 경우는 Component쪽에서 Service로만 요청을 하고 마는 경우이다.

 

Local Bound Service와 마찬가지로 ServiceConnection 객체를 생성하는데, 차이점은 Local Bound Service는 iBinder로부터 Service객체를 반환받아서 해당 객체를 직접 사용했지만, Remote Bound Service의 경우에는 서로 다른 Process상에 존재하기 때문에 위와 같은 직접적인 객체를 사용하거나 하지 못한다.

 

그래서 위 사진과 같이 Messenger 객체에 iBinder를 담은 후,

해당 Messenger에 정보가 담긴 Message객체를 담아서 send method를 사용하는 방식으로 통신을 한다.

 

이 때 replyTo 라는 내부변수에 이전에 만든 Handler를 담은 Messenger 객체를 담아주게 되는데,

이게 그대로 전달되어 Service쪽에서 이 객체.send 와 같은 방식으로 반대 통신이 가능해진다.

 

Service를 Bound하는 방법은 매우 간단하다.

intent에 Service의 Package, Class 정보를 담고 Local Bound Service와 마찬가지로 bindService Method를 호출하게되면 된다. 여기서 isBind 변수는 그냥 boolean형 변수로 해당 Service와 Bind 되었는지 안되었는지에 대한 정보를 담고있다.

 

Bound를 해제하는 과정에서 꼭 기억해야할 점은,

Service쪽에 내 Component의 Messenger 객체를 저장해놨을 경우 해제하기 전에 반드시 이 Messenger객체에 대한 정보를 지워주는 과정이 필요하다는 것이다. 여기서는 mMessage.what=2 에 대한 내용이다.

 

이후에 unbindService method를 사용해 Bound를 해제하게된다.

 

 

이외의 기능을 사용할 때는 Local Bound Service와 같이 바로그냥 사용할 수가 없어서 위와같이 what에 따라 기능을 달리하게 끔 구성을 해준 뒤 사용을 하면된다. 

 

 

이후에 반드시 AIDL을 사용한 방법도 해봐야한다 !!!

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함