Android通信v2.0

跨網(wǎng)絡(luò)通信

  • Socket
    本地通信,進(jìn)程從zygote進(jìn)程fork的指令都是用socket本地通信的

跨應(yīng)用/進(jìn)程通信

不考慮上面用跨網(wǎng)絡(luò)通信方式來解決 跨應(yīng)用/進(jìn)程通信

  • 文件
    基于Linux的文件解決了并發(fā)讀/寫的問題。所以可以基于文件通信,避免并發(fā)寫的問題
  • IBinder
  • Bundle/Intent
    Intent跨進(jìn)程通信,Bundle攜帶數(shù)據(jù)ArrayMap
    場景:四大組件傳遞消息
  • AIDL
    客戶端:
    aidl接口動(dòng)態(tài)生成IxxManager(遠(yuǎn)程代理類)
    代理類實(shí)現(xiàn)接口方法 調(diào)用構(gòu)造參數(shù)IBinder的transact()傳輸對(duì)應(yīng)的方法參數(shù)阻塞調(diào)用
    asBinder()得到這個(gè)代理類的實(shí)例供客戶端使用
    服務(wù)端:
    aidl接口動(dòng)態(tài)生成IxxManager
    創(chuàng)建IxxManager的stub匿名Binder實(shí)現(xiàn)接口方法的實(shí)際調(diào)用代理
    將binder通過onBind返回
    場景:高并發(fā),遠(yuǎn)程方法調(diào)用
  • Messager
    messager對(duì)Handler進(jìn)行了封裝
    服務(wù)端Handler處理發(fā)送的消息
    Messager通過OnBind()方法轉(zhuǎn)成IBinder給客戶端
    客戶端通過Messager.send()發(fā)送消息給服務(wù)端
    服務(wù)端通過Handler.handleMessage處理message對(duì)象,可從msg.replyTo的獲取客戶端的Messager,向客戶端發(fā)送消息
    場景:低并發(fā),互相傳遞消息
  • Binder池
    多個(gè)Binder(線程)在單個(gè)service上執(zhí)行(一個(gè)service完成多個(gè)AIDL接口工作)
  • ContentProvider
    提供不同應(yīng)用之間數(shù)據(jù)共享的方式,定義authorities為處理URI的路徑。提供對(duì)本地?cái)?shù)據(jù)庫表的CRUD操作。
  • Broadcast
    全局廣播監(jiān)聽,廣播監(jiān)聽action動(dòng)作處理主線程,發(fā)送action廣播

跨進(jìn)程傳輸對(duì)象序列化和反序列化

  • Serializable
    標(biāo)記接口,無需實(shí)現(xiàn),系統(tǒng)調(diào)用ObjectInputStream/ObjectOutStream等自動(dòng)序列化和反序列化所有屬性(除trainsient關(guān)鍵字標(biāo)記屬性外)
  • Pracelable
    需要實(shí)現(xiàn)類實(shí)現(xiàn)具體需要哪些序列化和反序列化的屬性

跨組件/線程通信

不考慮上面用跨網(wǎng)絡(luò)通信方式和跨應(yīng)用/進(jìn)程通信方式解決跨組件通信

跨組件通信

  • Handler
    單線程模型。(threadLocal+looper+handler)
    耦合的主線程通信(發(fā)送者和處理者高度耦合)
  • LocalBroadcastManager
    發(fā)送的私有數(shù)據(jù)不同擔(dān)心會(huì)被公開、沒有第三方應(yīng)用發(fā)送數(shù)據(jù)給你,不用擔(dān)心別人利用你的漏洞、比全局廣播傳遞數(shù)據(jù)更高效。
    handler分發(fā)在主線程處理廣播消息+根據(jù)Intent-filter的actions分發(fā)注冊(cè)監(jiān)聽action的廣播接手者
    解耦的主線程通信(handler的高級(jí)擴(kuò)展)
  • RxBus
    單線程通信(僅僅支持組件通信)
  • Otto
    解耦主線程通信(注解訂閱)
  • EventBus
    當(dāng)前線程消息隊(duì)列串行消息+根據(jù)消息class找到訂閱消息的處理者,然后分發(fā)線程調(diào)用處理對(duì)象處理
    實(shí)現(xiàn)相當(dāng)于LocalBroadcastMangaer升級(jí)版,注解和(反射/注解處理器)訂閱,切換線程處理消息。
    解耦的線程通信組件

組件內(nèi)異步任務(wù)

  • Thread+Handler
    實(shí)現(xiàn)異步任務(wù)+主線程通信
    場景:少量的短耗時(shí)任務(wù)
  • AsyncTask
    實(shí)現(xiàn)異步任務(wù),可以支持更新UI和進(jìn)度。(ExcutorService+Handler)
    異步任務(wù)執(zhí)行+主線程通信組件
    場景:少量短耗時(shí)任務(wù),如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫等
  • LoaderManager
    異步數(shù)據(jù)加載、數(shù)據(jù)源監(jiān)聽變化、橫豎屏切換數(shù)據(jù)保留
    contentProvider讀取數(shù)據(jù)IO操作異步任務(wù)+主線程通信
    場景:數(shù)據(jù)庫讀取短耗時(shí)任務(wù)
  • RxJava
    通信角度:異步任務(wù)+線程通信
    場景:文件處理、數(shù)據(jù)庫、網(wǎng)絡(luò)請(qǐng)求短耗時(shí)任務(wù)
  • IntentSerivce
    處理異步任務(wù)的Service。(Looper+Thread+Handler)
    脫離組件運(yùn)行的異步任務(wù)
    場景:單次下載任務(wù)這些長耗時(shí)任務(wù)
  • Service+process
    脫離組件運(yùn)行的后臺(tái)任務(wù)
    場景:多次下載、多媒體后臺(tái)播放、推送服務(wù)等長耗時(shí)任務(wù)
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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