Messenger跨進(jìn)程傳遞數(shù)據(jù)

1、Messenger類的說(shuō)明

Messenger類來(lái)擴(kuò)充IBinder接口機(jī)制,讓其能跨進(jìn)程地將Message對(duì)象傳遞到另一個(gè)進(jìn)程里,給其主線程(又稱UI線程)。

由于Message類實(shí)現(xiàn)(Implement)了Parcelable接口,所以Messenger類可以透過(guò)IBinder接口而將Message對(duì)象傳送到另一個(gè)進(jìn)程里的MessengerImpl類。然后,透過(guò)Handler而將Message對(duì)象丟入U(xiǎn)I線程的MQ里,讓UI線程來(lái)處理之。由于是同步(依序)處理信息,所以myService 類的開(kāi)發(fā)者,不必顧慮多線程沖突的安全議題,減輕開(kāi)發(fā)者的負(fù)擔(dān)。

2、Messenger單項(xiàng)傳遞數(shù)據(jù)

Messgener的兩個(gè)構(gòu)造方法

public Messenger(Handler target) {mTarget = target.getIMessenger(); }//service端使用

public Messenger(IBinder target) {mTarget = IMessenger.Stub.asInterface(target);}//client端使用

service端代碼


client端代碼

3、Messener雙向傳遞數(shù)據(jù)

通過(guò)message.replyTo = aMessenger將包含Binder接口的Messenger傳遞給Service
cbMessenger = msg.replyTo獲取Meesenger對(duì)象,? myService接到傳遞過(guò)來(lái)的IBinder接口時(shí), 就誕生一個(gè)新Messenger對(duì)象,并將該 IBinder接口存進(jìn)去。myService就能調(diào)用 該新Messenger對(duì)象的send()函數(shù),把 Message對(duì)象傳遞到myActivity端了

4、Messenger和AIDL區(qū)別

a、Messenger在服務(wù)端處理信息是通過(guò)Handler丟到主線程的MQ當(dāng)中,因此是單線程的串行處理,不支持多線程在service端處理傳遞過(guò)來(lái)的數(shù)據(jù),

b、Messenger只能用來(lái)傳遞數(shù)據(jù),調(diào)用service端的方法需要AIDL

service端使用多線程處理消息時(shí),使用AIDL
service端不需要多線程處理消息時(shí)使用Messenger
?著作權(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)容