天天看點

android ApiDemo學習(一)service——5 Remote Service Binding

可參考:http://blog.csdn.net/mapdigit/article/details/7707665

我的補充:

原理:

公共:使用AIDL定義公共接口,放在用戶端和服務端的src檔案夾下。

Service:stub實作公共接口,在onBind中傳回這個stub的IBinder

Client:定義ServiceConnection,重寫onConnect和onDisconnect函數,分别在s和c建立連接配接和斷開連接配接時調用。

              在onConnect函數中,使用AIDL接口名.stub.asInterface(Service傳回的IBinder名),将這個IBinder轉化成AIDL接口類型。

              調用bindService函數時,就會綁定Service,建立連接配接。

前提:

——在這個demo中,定義了兩個AIDL接口,分别是IRemoteService和Isecondary

——用戶端和服務端都在RemoteService.java中,服務端是RemoteService extends Service,用戶端是Binding extends Activity

步驟:

點選Bind按鈕:client與service連接配接

Client:調用兩個bindService函數,分别連接配接IRemoteService和ISecondary,參數中填入對應的intent

service:onCreate建立service

               調用兩次onbind,判斷是要連接配接哪個service,進而傳回對應的stub

Client:兩個service都連接配接上了,分别進入對應的兩個ServiceConnection的onServiceConnected

               onServiceConnected函數中:使用AIDL接口名.stub.asInterface(Service傳回的IBinder名),将這個IBinder轉化成AIDL接口類型。            

               第一個ServiceConnetion的onServiceConnected,還調用了第一個Service的函數registerCallback函數。(函數在AIDL檔案中沒有定義,隻有聲明,定義在Service端完成)

Service:執行registerCallback函數

點選kill process按鈕:client被殺死

Client:調用第二個Sercie的函數getPid

Service:執行getPid函數

Client:殺死自己

              進入兩個ServiceConnection的onServiceDisconnted函數,兩個連接配接斷開

            ——————————  過了一會——————————————————

Service:onCreate

               調用兩次onBind

Client:進入兩個ServiceConnection的onServiceConnected,兩個服務的連接配接都建立起來了

               onServiceConnected函數中:使用AIDL接口名.stub.asInterface(Service傳回的IBinder名),将這個IBinder轉化成AIDL接口類型。            

               第一個ServiceConnetion的onServiceConnected,還調用了第一個Service的函數registerCallback函數

Service:執行registerCallback函數

可以看到,用戶端殺死自己後,與service的連接配接斷開了,但過了一會,service會自動建立,再次連接配接!為什麼會這樣呢?因為在調用bindService是,最後一個參數指定為Context.BIND_AUTO_CREATE。

點選unbind Service

client:調用第一個Service的函數unregisterCallback函數

service:執行unregisterCallback函數

            onDestroy

IRemoteServiceCallback.aidl

在這個demo中,還使用到了另一個aidl接口IRemoteServiceCallback,裡面聲明了一個方法:valueChanged

IRemoteServiceCallback的實作在用戶端,定義了valueChanged函數。調用在service端。

過程:

1 service在onCreate的時候,給自己發了一條REPORT消息。

2 service定義了handler,其中的handleMessage函數中:接收到REPORT消息,就把value值加1(從0開始);然後讓每個與本service連接配接的client調用valueChanged函數,參數為value;然後隔1s又給自己發一個REPORT消息

3 client執行valueChanged函數,給自己發BUMP消息,參數是value

4 client定義了handler,其中的handleMessage函數中:接收到BUMP消息,在textview中顯示value

5 service接收到自己發來的REPORT消息,重複2-5