Messenger使用訊息的跨程序通訊

2023-02-08 03:03:05 字數 2360 閱讀 9558

messenger:信使

官方文件解釋:它引用了乙個handler物件,以便others能夠向它傳送訊息(使用 msg)方法)。該類允許跨程序間基於message的通訊(即兩個程序間可以通過message進行通訊),在服務端使用handler建立乙個messenger,客戶端持有這個messenger就可以與服務端通訊了。

以前我們使用handler+message的方式進行通訊,都是在同乙個程序中,從執行緒持有乙個主線程的handler物件,並向主線程傳送訊息。

而android既然可以使用bindler機制進行跨進行通訊,所以我們當然可以將handler與bindler結合起來進行跨程序傳送訊息。

檢視api就可以發現,messenger就是這種方式的實現。

一般使用方法如下:

1。遠端通過

j**a**

1. mmessenger=newmessenger(mhandler)

建立乙個信使物件

2。客戶端使用bindlerservice請求連線遠端

3。遠端onbind方法返回乙個bindler

j**a**

1. 4.客戶端使用遠端返回的bindler得到乙個信使(即得到遠端信使)

j**a**

1. publicvoidonserviceconnected(componentnamename,ibinderservice)

這裡雖然是new了乙個messenger,但我們檢視它的實現

j**a**

1. /**

2. *createamessengerfromarawibinder,whichhadpreviouslybeen

3. *retrievedwith.

4. *

5. *@.

6. */

7. publicmessenger(ibindertarget)

發現它的mtarget是通過aidl得到的,實際上就是遠端建立的那個。

5。客戶端可以使用這個遠端信使物件向遠端傳送訊息:

這樣遠端服務端的handler物件就能收到訊息了,然後可以在其handlermessage(message msg)方法中進行處理。(該handler物件就是第一步服務端建立messenger時使用的引數mhandler).

經過這5個步驟貌似只有客戶端向服務端傳送訊息,這樣的訊息傳遞是單向的,那麼如何實現雙向傳遞呢?

首先需要在第5步稍加修改,在send(msg)前通過 = mmessenger將自己的信使設定到訊息中,這樣服務端接收到訊息時同時也得到了客戶端的信使物件了,然後服務端可以通過

j**a**

1. //得到客戶端的信使物件,並向它傳送訊息

2. cmessenger=

3. 即完成了從服務端向客戶端傳送訊息的功能,。

雙向通訊宣告完成。

下面改寫apidemos工程實現messenger通訊

j**a**

1. 2.

3. 4.

5. 6.

7. 8.

9. 10.

11.12.

13.14. publicclassmessengerserviceextendsservice

24.25. @override

26. publicbooleanonunbind(intentintent)

31.32. staticfinalintmsg_register_client=1;

33. staticfinalintmsg_unregister_client=2;

34. staticfinalintmsg_set_value=3;

35.36. privaterandomrandom=newrandom();

37.38. privatehandlermhandler=newhandler()catch(remoteexceptione)

58. break;

59. default:

60.61. }

62.63. }

64. };

65.66. /**

67. *自己的信使物件

68. */

69. privatemessengermmessenger=newmessenger(mhandler);

70.71. /**

72. *客戶的信使

73. */

74. privatemessengercmessenger;

75.76. @override

77. publicibinderonbind(intentintent)

83.84. @override

85. publicvoidonrebind(intentintent)

90.91. }

j**a**

《春天的訊息》教學反思

一 非常感謝百忙之餘來華景小學聽課並給與指導的老師們,同時,我也要感謝我們科組老師,說實話,能上這次公開課,她們給了我很大的幫助,平常我們利用學校教研時間集體備課幫我修改教案的不足,做為新老師雖然有壓力但是感覺還是很幸福,真的很感謝她們。二 就這節課而言,我和科組老師還是認真的去準備,起初是為前一段...

《春的訊息》教學反思

伴隨著春的腳步,新的學期已經來到。開啟新的單元,撲面而來的是春天 春雨帶來的春的訊息。新學期,新起點,樹新思,立新意 這是我為本學期的教學反思尋找的新的起點。本單元的文化主題是 走進春天 學習本單元要從兩個方面入手 首先,要感受自然界春光的美好,置身於大自然的懷抱,用心體驗,感受春天帶給自然萬物的變...

使用框架跨域執行不丟失session的方法

前幾天因為一企業 內有一客戶的服務系統,那個 因為是租用的空間,不足以存放客戶系統,所以另外搞了個伺服器,為了使網域名稱的統一性 另乙個伺服器的網域名稱與原網域名稱差別過大 所以把這個客戶系統用框架包含在了原來的 內,但碰到了因為跨域操作而使客戶系統使用者登陸後發生session丟失的問題,困撓了一...