messenger與aidl的異同
最近做專案需要使用程序間通訊,大家知道應用層的程序間通訊無非broadcast,activity,service,content provider四大元件。broadcast適用於一對多,我這裡是一對一(子程序與主程序)的關係,且broadcast效能較差,所以不用broadcast。另外content provider主要使用者本地持久化資料的通訊,我這裡主要是記憶體級別的資料,所以也不用content provider。activity使用intent進行程序間通訊,使用的時候還需要start activity,且不能持續通訊,不能滿足需求。剩下的只有service了,而service也恰恰是最合適的。
使用service進行程序間通訊,一種方法是start service,這和start activty一樣,不用這種方法。另一種方法是bind service,這種可以持續通訊,我們採用這種方式來進行程序間通訊。
說到bind service進行程序間通訊,大家都會想到aidl(android inte***ce definition language)和messenger,那它們兩個到底有什麼異同,哪個更好用,更方便,效率更高呢,這是我接觸到它們兩個時的疑問,帶著這個疑問,我稍稍的研究了一下它們兩個,把研究的結果貼在這裡,做個備份,以免下次再忘掉。
結論:
1. messenger本質也是aidl,只是進行了封裝,開發的時候不用再寫.aidl檔案。
結合我自身的使用,因為不用去寫.aidl檔案,相比起來,messenger使用起來十分簡單。但前面也說了,messenger本質上也是aidl,故在底層程序間通訊這一塊,兩者的效率應該是一樣的。
2. 在service端,messenger處理client端的請求是單執行緒的,而aidl是多執行緒的。
使用aidl的時候,service端每收到乙個client端的請求時,就會啟動乙個執行緒(非主線程)去執行相應的操作。而messenger,service收到的請求是放在handler的messagequeue裡面,handler大家都用過,它需要繫結乙個thread,然後不斷poll message執行相關操作,這個過程是同步執行的。
3. client的方法,使用aidl獲取返回值是同步的,而messenger是非同步的。
messenger只提供了乙個方法進行程序間通訊,就是send(message msg)方法,傳送的是乙個message,沒有返回值,要拿到返回值,需要把client的messenger作為msg.replyto引數傳遞過去,service端處理完之後,在呼叫客戶端的messenger的send(message msg)方法把返回值傳遞歸client,這個過程是非同步的,而aidl你可以自己指定方法,指定返回值,它獲取返回值是同步的。
其實,第二點是有辦法解決的,在service端,messenger的handler可以只當作乙個**器,不處理請求,只**請求到相應的處理執行緒(多是相應的handlerthread),這樣也可以達到非同步的效果。
那我最後選用了什麼呢?我選用了aidl,主要是因為第三點messenger無法滿足需求,還有就是messenger其實是封裝了一下aidl,我們也可以封裝一下呀,既能實現messenger那樣簡潔的效果,也能滿足同步獲取返回值的問題,這個後面再說
AIDL與Binder的區別
binder是乙個遠端物件的基礎類,核心部分是遠端呼叫機制,這部分是由ibinder定義的。它是對ibinder類的實現,其中ibinder類提供了這樣乙個類的標準的本地化實現方式。大多數開發者不會去直接實現binder類,而是用aidl工具來描述他們自己想要的介面,借助它來生成乙個合適的binde...
AI DL方法與問題空間探索
所謂問題的解決是生存引數空間的一種狀態轉移到另外一種狀態,而目的狀態恰好是主體所希望的。完成這種轉換的一系列指令碼變化過程叫做場景序列,也叫通路。驅動這一些列場景轉換的主體參與過程,被稱為主動執行。而主體參與執行過程所抽象出來的主動參與行為規則,被稱為解決問題的方法。狀態空間轉換總有一條最短時間轉換...
aidl的使用簡介
客戶端 private isizeaidlinte ce sizeinte ce private serviceconnection connection new serviceconnection override public void onservicedisconnected compone...