跨網路通訊
- Socket 本地通訊,程式從zygote程式fork的指令都是用socket本地通訊的
跨應用/程式通訊
不考慮上面用跨網路通訊方式來解決 跨應用/程式通訊
- 檔案 基於Linux的檔案解決了併發讀/寫的問題。所以可以基於檔案通訊,避免併發寫的問題
- IBinder
- Bundle/Intent Intent跨程式通訊,Bundle攜帶資料ArrayMap 場景:四大元件傳遞訊息
- AIDL 客戶端: aidl介面動態生成IxxManager(遠端代理類) 代理類實現介面方法 呼叫構造引數IBinder的transact()傳輸對應的方法引數阻塞呼叫 asBinder()得到這個代理類的例項供客戶端使用 服務端: aidl介面動態生成IxxManager 建立IxxManager的stub匿名Binder實現介面方法的實際呼叫代理 將binder通過onBind返回 場景:高併發,遠端方法呼叫
- Messager messager對Handler進行了封裝 服務端Handler處理髮送的訊息 Messager通過OnBind()方法轉成IBinder給客戶端 客戶端通過Messager.send()傳送訊息給服務端 服務端通過Handler.handleMessage處理message物件,可從msg.replyTo的獲取客戶端的Messager,向客戶端傳送訊息 場景:低併發,互相傳遞訊息
- Binder池 多個Binder(執行緒)在單個service上執行(一個service完成多個AIDL介面工作)
- ContentProvider 提供不同應用之間資料共享的方式,定義authorities為處理URI的路徑。提供對本地資料庫表的CRUD操作。
- Broadcast 全域性廣播監聽,廣播監聽action動作處理主執行緒,傳送action廣播
跨程式傳輸物件序列化和反序列化
- Serializable 標記介面,無需實現,系統呼叫ObjectInputStream/ObjectOutStream等自動序列化和反序列化所有屬性(除trainsient關鍵字標記屬性外)
- Pracelable 需要實現類實現具體需要哪些序列化和反序列化的屬性
跨元件/執行緒通訊
不考慮上面用跨網路通訊方式和跨應用/程式通訊方式解決跨元件通訊
跨元件通訊
- Handler 單執行緒模型。(threadLocal+looper+handler) 耦合的主執行緒通訊(傳送者和處理者高度耦合)
- LocalBroadcastManager 傳送的私有資料不同擔心會被公開、沒有第三方應用傳送資料給你,不用擔心別人利用你的漏洞、比全域性廣播傳遞資料更高效。 handler分發在主執行緒處理廣播訊息+根據Intent-filter的actions分發註冊監聽action的廣播接手者 解耦的主執行緒通訊(handler的高階擴充套件)
- RxBus 單執行緒通訊(僅僅支援元件通訊)
- Otto 解耦主執行緒通訊(註解訂閱)
- EventBus 當前執行緒訊息佇列序列訊息+根據訊息class找到訂閱訊息的處理者,然後分發執行緒呼叫處理物件處理 實現相當於LocalBroadcastMangaer升級版,註解和(反射/註解處理器)訂閱,切換執行緒處理訊息。 解耦的執行緒通訊元件
元件內非同步任務
- Thread+Handler 實現非同步任務+主執行緒通訊 場景:少量的短耗時任務
- AsyncTask 實現非同步任務,可以支援更新UI和進度。(ExcutorService+Handler) 非同步任務執行+主執行緒通訊元件 場景:少量短耗時任務,如網路請求、資料庫等
- LoaderManager 非同步資料載入、資料來源監聽變化、橫豎屏切換資料保留 contentProvider讀取資料IO操作非同步任務+主執行緒通訊 場景:資料庫讀取短耗時任務
- RxJava 通訊角度:非同步任務+執行緒通訊 場景:檔案處理、資料庫、網路請求短耗時任務
- IntentSerivce 處理非同步任務的Service。(Looper+Thread+Handler) 脫離元件執行的非同步任務 場景:單次下載任務這些長耗時任務
- Service+process 脫離元件執行的後臺任務 場景:多次下載、多媒體後臺播放、推送服務等長耗時任務