天天看點

Android遠端服務與本地服務的特點以及功能差異

最近又重新看了點IPC的相關知識,以前看過不少Binder的知識,看到c++層思路就很模糊了,回頭再看也算是一種學習。

鑒于以前也知識看看相關知識,從來也沒動手去做過,于是就照着官方文檔開始動手建立Demo, 在按照官方文檔實作之後,我察覺到有一個需求,官方隻是說用戶端可以調用遠端服務端,那麼遠端服務端想要調用用戶端可不可以呢?

為了盡快實作需求,那我就先将服務啟動在本地,也就是說與Service與Activity處于同一程序,進行測試。它的結果是可行的,相關代碼如下:

Activity相關代碼:

Service相關代碼:

上述結果是可以在同一程序的Activity與Service間互相通信的,因為在onServiceConnected中回調的Binder對象則為剛剛Service傳回的對象,在Activity中列印的Log如下:

Android遠端服務與本地服務的特點以及功能差異

那麼跨程序間互相通信可不可以呢?

我們在Service的Manifest檔案中給Service添加Process屬性,屬性值為:remote:

好了,這下啟動服務之後,它就屬于遠端服務了,它與Activity不屬于同一個程序,在Android中一個程序則是一個虛拟機。

如果我再按照剛才的方法進行測試,服務是啟動了,但是Activity收到的Binder對象卻是這樣的:

Android遠端服務與本地服務的特點以及功能差異

這裡是說,傳回的元件名稱為RemoteService,但是傳回的Binder對象則為BinderProxy,這個BinderProxy則為RemoteService遠端服務在本地的代理,熟悉AIDL的相關資訊的人,肯定知道Proxy知道是什麼。

那麼我們在這裡可不可以從Proxy對象中把遠端的RemoteService對象拿到呢,我們看一下調試資訊:

Android遠端服務與本地服務的特點以及功能差異

我們看到在Proxy中的并沒有RemoteService的引用,嗯,因為IPC通信,是跨程序的,我們都是通過代理與服務打交道的,是以...

那麼回到标題,說說遠端服務與本地服務的特點與差異:

其實都是服務,提供的功能一緻,隻是一個在本地,一個在其它程序,是以,服務與用戶端打交道的時候就有了不同,要謹慎對待。

繼續閱讀