《Android》『呼叫外部 App』- 透過 Messager 與 Service 執行外部 App 並互相溝通(IPC)的基本方法

《簡單介紹》

IPC 的全名是 Inter-Process Communication,中文叫做行程間通訊,在 android 中,不同的 App 可以看成不同的行程,每個行程都有自己一部分獨立的系統資源,彼此是隔離的。為了能使不同的行程互相存取資源並進行協調工作,才有了行程間通訊。

 

《用法介紹》

在 android 中,行程間通訊的實作有幾種方式,一種是透過 AIDL 的方式,另一種則是透過 Messager,也就是這篇文章所要介紹的,假設現在有兩個 App,我們姑且把這兩個 App 當作用戶端與伺服端,在伺服端我們定義了回應不同類型 Message 物件的 Handler,這個 Handler 是 Messenger 的基礎,之後便可以與用戶端分享 IBinder,讓用戶端使用 Message 物件傳送命令給伺服端。

以下直接透過程式碼片段,說明實作的方式。

1. 在專案中建立兩個 App

首先我們在 Android Studio 專案中同時建置兩個應用程式,先建立一個程式專案,在此程式專案點右鍵選 Module,接著選 Phone & Tablet Module ,就可以在此專案中建立另一個應用程式。

2. 先實作伺服端的程式

MessengerService.java

在伺服端程式中,我們建立了一個繼承自 Service 的自訂類別 MessengerService,並在裡面實作了一個Messenger 的物件 mMessenger,在 mMessenger 中處理由用戶端程式所傳來的訊息,最後透過 onBind() 將此物件的 Binder 回傳。

AndroidManifest.xml

最後記得要在此伺服端程式的 AndroidManifest.xml 中註冊此 MessengerService。

3. 再來實作用戶端的程式

現在我們已經建立好伺服端的程式,那麼在用戶端該如何去與之互動呢?我們已經知道在伺服端的程式中,定義了一個 Service 服務,因此在用戶端的程式中,便可以透過 bindService 的方式讓兩個程式聯繫起來。

MainActivity.java

在伺服端程式的 onBind() 方法,會在 Service 綁定成功後回傳定義在伺服端程式的 mMessenger 物件,因此我們在用戶端程式,可以透過 繼承自 ServiceConnection 的物件 mServiceConnection 取得此 messager,透過這個 messager 的 send(Message) 方法,我們可以將想要傳遞的資訊傳給伺服端程式,要注意的是,我們必須在要傳遞給伺服器程式的 Messager 的 replyTo 參數中,塞入在用戶端程式所定義的 Messenger 物件 mMessenger,這麼一來,兩個程式之間就建立起了一個雙向溝通的管道。

以此範例來說,我們分解程式中的流程如下 –

Step1.

當用戶端程式啟動後,會先透過 bindService 啟動並綁定位於伺服端程式的 MessengerService,並在綁定成功後取得其中所定義的 Messenger 物件 mMessenger。

Step2.

在用戶端程式中,也定義了一個 Messenger 物件 mMessenger,用來處理當收到從伺服端程式傳來的 Message 時,所該做的事情。

Step3.

接著當使用者透過用戶端程式按下 btnAdd 按鈕後,將想要傳遞給伺服端程式的資料包成名為 msgToServer 的 Message 物件,並在 msgToServer 的 replyTo 參數中塞入用戶端所定義的 mMessenger,最後透過在步驟一所取得的 mMessenger(伺服端傳來的) 之 send(Message) 方法,將 msgToServer 發送給伺服端程式。

Step4.

在伺服端程式中,因為用戶端程式是透過伺服端本身所定義的 Messager 發出訊息,所以會直接觸發在其中定義好的 mMessenger, 此 mMessenger 亦是用來處理當收到從用戶端程式傳來的 Message 時,所該做的事情的地方。

Step5.

在伺服端程式中,因為在步驟三時,我們有將在用戶端定義好的 mMessager 塞入 replyTo 參數傳回來,所以我們可以透過 msgFromClient.replyTo 的方法,取得 mMessenger(用戶端傳來的),同樣利用其 send(Message) 方法,將 msgToClient 發回給用戶端程式。

賽肥膩膩

我們是低調到不行的肥膩夫妻檔,一路上一邊吵鬧一邊記錄著生活大小事,最近迷上了宅在家追劇,希望能透過文字將所有看過的影集好好紀錄,整理成屬於我們自己的回憶資料庫。

上 / 下一篇文章

臉書留言

一般留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *