跨網(wǎng)絡(luò)通信
- Socket
本地通信,進(jìn)程從zygote進(jìn)程fork的指令都是用socket本地通信的
跨應(yīng)用/進(jìn)程通信
不考慮上面用跨網(wǎng)絡(luò)通信方式來(lái)解決 跨應(yīng)用/進(jìn)程通信
- 文件
基于Linux的文件解決了并發(fā)讀/寫的問(wèn)題悼沈。所以可以基于文件通信屈溉,避免并發(fā)寫的問(wèn)題 - IBinder
- Bundle/Intent
Intent跨進(jìn)程通信塞关,Bundle攜帶數(shù)據(jù)ArrayMap
場(chǎng)景:四大組件傳遞消息 - 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通過(guò)onBind返回
場(chǎng)景:高并發(fā),遠(yuǎn)程方法調(diào)用 - Messager
messager對(duì)Handler進(jìn)行了封裝
服務(wù)端Handler處理發(fā)送的消息
Messager通過(guò)OnBind()方法轉(zhuǎn)成IBinder給客戶端
客戶端通過(guò)Messager.send()發(fā)送消息給服務(wù)端
服務(wù)端通過(guò)Handler.handleMessage處理message對(duì)象语婴,可從msg.replyTo的獲取客戶端的Messager,向客戶端發(fā)送消息
場(chǎng)景:低并發(fā)描孟,互相傳遞消息 - Binder池
多個(gè)Binder(線程)在單個(gè)service上執(zhí)行(一個(gè)service完成多個(gè)AIDL接口工作) - ContentProvider
提供不同應(yīng)用之間數(shù)據(jù)共享的方式,定義authorities為處理URI的路徑砰左。提供對(duì)本地?cái)?shù)據(jù)庫(kù)表的CRUD操作匿醒。 - Broadcast
全局廣播監(jiān)聽(tīng),廣播監(jiān)聽(tīng)action動(dòng)作處理主線程缠导,發(fā)送action廣播
跨進(jìn)程傳輸對(duì)象序列化和反序列化
- Serializable
標(biāo)記接口廉羔,無(wú)需實(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ì)被公開(kāi)憋他、沒(méi)有第三方應(yīng)用發(fā)送數(shù)據(jù)給你,不用擔(dān)心別人利用你的漏洞髓削、比全局廣播傳遞數(shù)據(jù)更高效竹挡。
handler分發(fā)在主線程處理廣播消息+根據(jù)Intent-filter的actions分發(fā)注冊(cè)監(jiān)聽(tīng)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ù)+主線程通信
場(chǎng)景:少量的短耗時(shí)任務(wù) - AsyncTask
實(shí)現(xiàn)異步任務(wù),可以支持更新UI和進(jìn)度好啰。(ExcutorService+Handler)
異步任務(wù)執(zhí)行+主線程通信組件
場(chǎng)景:少量短耗時(shí)任務(wù)轩娶,如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫(kù)等 - LoaderManager
異步數(shù)據(jù)加載框往、數(shù)據(jù)源監(jiān)聽(tīng)變化鳄抒、橫豎屏切換數(shù)據(jù)保留
contentProvider讀取數(shù)據(jù)IO操作異步任務(wù)+主線程通信
場(chǎng)景:數(shù)據(jù)庫(kù)讀取短耗時(shí)任務(wù) - RxJava
通信角度:異步任務(wù)+線程通信
場(chǎng)景:文件處理、數(shù)據(jù)庫(kù)椰弊、網(wǎng)絡(luò)請(qǐng)求短耗時(shí)任務(wù) - IntentSerivce
處理異步任務(wù)的Service许溅。(Looper+Thread+Handler)
脫離組件運(yùn)行的異步任務(wù)
場(chǎng)景:?jiǎn)未蜗螺d任務(wù)這些長(zhǎng)耗時(shí)任務(wù) - Service+process
脫離組件運(yùn)行的后臺(tái)任務(wù)
場(chǎng)景:多次下載、多媒體后臺(tái)播放男应、推送服務(wù)等長(zhǎng)耗時(shí)任務(wù)