了解Android進(jìn)程間通信,首先要了解如下幾個(gè)內(nèi)容:
- 對(duì)象序列化
通過(guò)Serializable或者Parcelable進(jìn)行對(duì)象的序列化。Serializable是java中的序列化接口,大量的I/O操作開銷較大,Parcelable是Android平臺(tái)提供的序列化方法,效率高但使用復(fù)雜。在將對(duì)象序列化存儲(chǔ)或者通過(guò)網(wǎng)絡(luò)傳輸建議使用Serializable,較簡(jiǎn)單;內(nèi)存序列化則推薦使用Parcelable; - binder
binder是Android主要的跨進(jìn)程通信方式,aidl、Messenger等其本質(zhì)上都是使用的binder;binder采用C/S架構(gòu),通過(guò)內(nèi)存映射實(shí)現(xiàn)一次拷貝同步數(shù)據(jù),具有較高的效率。
下面總結(jié)一下主要的幾種快進(jìn)程通信方式
Bundle
Bundle實(shí)現(xiàn)了Parcelable接口,可以在進(jìn)程之間傳遞。常用與在activity、Service、Receiver之間,通過(guò)intent傳遞數(shù)據(jù)。使用方法很簡(jiǎn)單,只能傳遞bundle支出的數(shù)據(jù)類型。
文件共享
文件共享的原理很簡(jiǎn)單:通過(guò)對(duì)同一個(gè)文件的讀寫,實(shí)現(xiàn)進(jìn)程間通信的目的,但需要處理并發(fā)讀寫的問(wèn)題,適用于對(duì)數(shù)據(jù)同步要求不高的場(chǎng)景;
Messenger
Messenger實(shí)際是對(duì)AIDL的封裝,分為客戶端與服務(wù)端。通過(guò)消息隊(duì)列處理消息,不存在并發(fā)執(zhí)行的情況,這種特點(diǎn)適合相應(yīng)的應(yīng)用場(chǎng)景。下面簡(jiǎn)單描述下它的使用方法:
- service
- 定義一個(gè)Handle處理從client傳遞過(guò)來(lái)的message
- 通過(guò)Handle可以new一個(gè)service的messenger,serverMessenger = new Messenger(serverHandler);
- service需要重寫public IBinder onBind(Intent intent),通過(guò)serverMessenger.getBinder(),返回IBinder
- client
- 綁定service,綁定時(shí)需要new一個(gè)ServiceConnection傳入,并在onServiceConnected中獲取service的messenger(通過(guò)IBinder創(chuàng)建);
- 定義一個(gè)Handle處理從service傳遞過(guò)來(lái)的message;
- 通過(guò)handle可以new一個(gè)client的messenger,并將該messenger通過(guò)messenger傳遞,messageToServer.replyTo = clientMessenger;
- 通信流程
client綁定service,在onServiceConnected通過(guò)IBinder創(chuàng)建service的messenger,創(chuàng)建message,并將自己的messenger通過(guò)replyto當(dāng)?shù)續(xù)essage上send。service獲取message后也活得了client的messenger,service通過(guò)handle處理message,可以通過(guò)client的messenger發(fā)送消息給client。
AIDL
功能強(qiáng)大,支持一對(duì)多并發(fā)通信,但使用稍復(fù)雜。主要適用于有遠(yuǎn)程調(diào)用需求的IPC。相關(guān)內(nèi)容細(xì)節(jié)很多,這里簡(jiǎn)單概括一下流程。
- 服務(wù)端
創(chuàng)建AIDL文件,定義相關(guān)接口,SDK會(huì)自動(dòng)根據(jù)AIDL文件生成對(duì)應(yīng)的Binder類;在client綁定Service的時(shí)候,將實(shí)現(xiàn)這個(gè)AIDL的Binder傳遞給client; - 客戶端
綁定Service,綁定成功后,將服務(wù)端返回的Binder對(duì)象轉(zhuǎn)成AIDL接口,調(diào)用服務(wù)端暴露的即可。
ContentProvider
ContentProvider用在不同進(jìn)程間數(shù)據(jù)共享,它底層也是binder,是進(jìn)行了封裝,專門用于不同應(yīng)用間數(shù)據(jù)共享的??捎糜谝粚?duì)多的進(jìn)程間數(shù)據(jù)共享,主要提供數(shù)據(jù)源的CRUD操作。
Socket
socket都可以通過(guò)網(wǎng)絡(luò)進(jìn)行終端間的通信,進(jìn)程間通信自然也是可以,這里不做過(guò)多介紹,主要用于網(wǎng)絡(luò)間通信。