91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android進程間通訊之messenger

發布時間:2020-07-17 08:07:39 來源:網絡 閱讀:369 作者:天涯花生 欄目:移動開發

平時一說進程間通訊,大家都會想到AIDL,其實messengerAIDL作用一樣,都可以進行進程間通訊。它是基于消息的進程間通信,就像子線程和UI線程發送消息那樣,是不是很簡單,還不用去寫AIDL文件,是不是有點小爽。哈哈。

 

此外,還支持記錄客戶端對象的Messenger,然后可以實現一對多的通信;甚至作為一個轉接處,任意兩個進程都能通過服務端進行通信。

 

AIDL 比較:

  當您需要執行 IPC 時,為您的接口使用 Messenger 要比使用 AIDL 實現更加簡單,因為 Messenger 會將所有服務調用排入隊列,而純粹的 AIDL 接口會同時向服務發送多個請求,服務隨后必須應對多線程處理。

 

  對于大多數應用,服務不需要執行多線程處理,因此使用 Messenger 可讓服務一次處理一個調用。如果您的服務必須執行多線程處理,則應使用 AIDL 來定義接口。

 

接下來看下怎么寫:

 

服務端:

1.創建一個handler對象,并實現hanlemessage方法,用于接收來自客戶端的消息,并作處理

2.創建一個messenger(送信人),封裝handler

3.messenger創建一個IBinder對象,通過onBind返回給客戶端

 

客戶端:

1.activity中綁定服務

2.創建ServiceConnection并在其中使用IBinder Messenger實例化

3.使用Messenger向服務端發送消息

4.解綁服務

5.服務端中在 handleMessage()方法中接收每個 Message

 

這樣,客戶端并沒有調用服務的“方法”。而客戶端傳遞的“消息”(Message 對象)是服務在其 Handler 中接收的。

 

上面實現的僅僅是單向通信,即客戶端給服務端發送消息,如果我需要服務端給客戶端發送消息又該怎樣做呢?

 

其實,這也是很容易實現的,下面就讓我們接著上面的步驟來實現雙向通信吧

1.在客戶端中創建一個Handler對象,用于處理服務端發過來的消息

2.創建一個客戶端自己的messenger對象,并封裝handler

3.將客戶端的Messenger對象賦給待發送的Message對象的replyTo字段

4.在服務端的Handler處理Message時將客戶端的Messenger解析出來,并使用客戶端的Messenger對象給客戶端發送消息

 

這樣就實現了客戶端和服務端的雙向通信了。

 

注意:注:Service在聲明時必須對外開放,即android:exported="true"另外,我在開發完APP都會用一些APP在線自動化測試工具進行測試:www.ineice.com


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

钟山县| 清远市| 宿松县| 紫金县| 富裕县| 临夏县| 永昌县| 宁晋县| 贡嘎县| 赣州市| 扶风县| 全南县| 冕宁县| 深州市| 恩施市| 贡嘎县| 谢通门县| 石家庄市| 英山县| 自贡市| 连州市| 阿城市| 邳州市| 安图县| 南安市| 东辽县| 洛阳市| 长泰县| 彭水| 那曲县| 昭觉县| 京山县| 昭平县| 大冶市| 涟水县| 贵南县| 建德市| 罗平县| 林甸县| 桂东县| 观塘区|