可參考: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