안드로이드 개발 질문/답변
(글 수 45,052)
질문입니다.
현재 google Api demo를 통해서
localservice , localbindservice , remoteserivce , remotebindservice를 구현 테스트 했습니다.
실제로 DDMS를 통해서 process가 기동하는것을 보고 local일때는 같은 process에서 service가 실행되는것을 확인했고.
remote일때는 :remote 프로세스로 잡히는것을 확인했습니다.
localservice일경우 startservice, bindservice를 호출하여 service와 연결하고.
remote일때는 ibinder + aidl를 이용하여 RPC 이용합니다.
자 그럼 여기서 궁금..
localservice는 반드시 같은(동일 PID) process를 사용하는것을 말하지 궁금하여..??
AndroidManifest.xml 를 수정
하고 에뮬을 띄어 보니.. serivce process가 다른 프로세스를 기동되고 서비스연결또한 성공적으로 됩니다.
반대로 remotebindservice에서
아래와 같이 수정하여
에뮬을 띄웠더니 동일 프로세스에서 remote service?? 가 실행되는것을 보았습니다.
1)질문.
remote 하면 반드시 다른 프로세스일거라고 생각을 했는데요..
혹시 ibinder + aidl를 사용하더라고 android:process=":remote 추가하지않으면 remote -> local로 바뀌면서
localservice인것으로 사용이 되는거가 하고 생각이 드는데요? 이게 맞는 소리인지?
2)질문및 자해석
반대로 localservice에서 android:process=":remote 추가하여 remote에서도 service를 할수 있는건지요??
아 이것은 이론적으로 리모트에서 aidl lib가 없으면 remote로 호출이 안되겠네요...
하지만 remote 다른 프로세스로 띠워지긴하니.. 같은 package에서 다른 service를 기동하여 오히려
process를 분리하는 장점이 생기지 않을까 합니다만.
질문이 좀 엉성하져.. 죄송하구요..
service쪽에서 이런저런 테스트드해보시거나 개념적으로 정확히 집어주시면 감사하겠습니다.
구현자체는 심플하나. 정확이 이게 이것이다 이런내용이 없네요..
수고하세요 ^^
현재 google Api demo를 통해서
localservice , localbindservice , remoteserivce , remotebindservice를 구현 테스트 했습니다.
실제로 DDMS를 통해서 process가 기동하는것을 보고 local일때는 같은 process에서 service가 실행되는것을 확인했고.
remote일때는 :remote 프로세스로 잡히는것을 확인했습니다.
localservice일경우 startservice, bindservice를 호출하여 service와 연결하고.
remote일때는 ibinder + aidl를 이용하여 RPC 이용합니다.
자 그럼 여기서 궁금..
localservice는 반드시 같은(동일 PID) process를 사용하는것을 말하지 궁금하여..??
AndroidManifest.xml 를 수정
<service android:name=".LocalService" android:process=":remote"></service>
하고 에뮬을 띄어 보니.. serivce process가 다른 프로세스를 기동되고 서비스연결또한 성공적으로 됩니다.
반대로 remotebindservice에서
<service android:name=".RemoteService" android:process=":remote">
아래와 같이 수정하여
<service android:name=".RemoteService">
에뮬을 띄웠더니 동일 프로세스에서 remote service?? 가 실행되는것을 보았습니다.
1)질문.
remote 하면 반드시 다른 프로세스일거라고 생각을 했는데요..
혹시 ibinder + aidl를 사용하더라고 android:process=":remote 추가하지않으면 remote -> local로 바뀌면서
localservice인것으로 사용이 되는거가 하고 생각이 드는데요? 이게 맞는 소리인지?
2)질문및 자해석
반대로 localservice에서 android:process=":remote 추가하여 remote에서도 service를 할수 있는건지요??
아 이것은 이론적으로 리모트에서 aidl lib가 없으면 remote로 호출이 안되겠네요...
하지만 remote 다른 프로세스로 띠워지긴하니.. 같은 package에서 다른 service를 기동하여 오히려
process를 분리하는 장점이 생기지 않을까 합니다만.
질문이 좀 엉성하져.. 죄송하구요..
service쪽에서 이런저런 테스트드해보시거나 개념적으로 정확히 집어주시면 감사하겠습니다.
구현자체는 심플하나. 정확이 이게 이것이다 이런내용이 없네요..
수고하세요 ^^
2010.07.16 11:20:14
음... 우선 Local Service 는 동일한 Process 에서 동작하는 Service, Remote Service 는 별개의 Process 에서 동작하는 Service 를 지칭하는 것이 맞습니다.
다음으로 Service 와 Bind 하여 API 를 호출하는 방법에 관해서 이야기해보자면 두 가지 방법이 있을 수 있겠네요.
첫번째는 현재 돌고 있는 Service 객체를 직접 반환 받아서 API 를 호출하는 방법, 두 번째는, IBinder 의 도움을 받아서, Stub 객체를 받아와 해당 객체를 이용하여 API 를 호출하는 방법이 있습니다.
Local Service 의 경우, 당연히 첫 번째 방법과 두 번째 방법 모두를 사용할 수 있습니다.
하지만, Remote Service 의 경우 첫 번째 방법을 사용할 수 없으며, 두 번째 방법을 사용해야 합니다.
따라서, 스파이더님이 작성하신 글에서 궁금한 점이 한가지 있는데;;; 바로 구글 API 예제의 Local Service 를 서로 다른 Process 에서 동작시킨 상황에서 해당 Service 와 정상적으로 연결이 가능했다는 부분입니다. 구글 예제의 Local Service 는 Bind 요청시 자기 자신의 객체의 참조를 직접 반환하도록 구현되어있기 때문에, 서로 다른 Process 에서 해당 Service 에 Bind 해서 API 를 호출하는 경우 정상적으로 실행되지 않을 거 같은데... 신기합니다;;; (제가 테스트 해보니 ClassCastException 이 납니다만...)
2010.07.16 12:00:32
아 댓글 감사합니다..
"신기합니다;; " 요 멘트가 아 내가 이것은 확인 안했는데 급 생각이 나네요 ^^
localservice startservice를 호출시에 무리없이 다른 PID로 접근이 가능했구요.
localservice 에서 bindservice를 이용할때는 ((LocalService.LocalBinder)service).getService() 자기 자신 객체를 반환하도록 되있네요.
그럼 ClassCastException 날것 같네요..
지적감사합니다.. 점심후 몇가지 질문을 더 드릴께요 ~
혹시 휴우님이 휴휴휴 블로그 님이세요??
요즘 휴휴휴블로그를 통해서 아하 무릅치는 일이 많은데요 ~ 댓글 감사합니다 ~ 좋은글이 넘 많음!!
감사합니다~^^