Android IPC總結(jié)

了解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
  1. 定義一個(gè)Handle處理從client傳遞過(guò)來(lái)的message
  2. 通過(guò)Handle可以new一個(gè)service的messenger,serverMessenger = new Messenger(serverHandler);
  3. service需要重寫public IBinder onBind(Intent intent),通過(guò)serverMessenger.getBinder(),返回IBinder
  • client
  1. 綁定service,綁定時(shí)需要new一個(gè)ServiceConnection傳入,并在onServiceConnected中獲取service的messenger(通過(guò)IBinder創(chuàng)建);
  2. 定義一個(gè)Handle處理從service傳遞過(guò)來(lái)的message;
  3. 通過(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ò)間通信。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容