2012-03-05 52 views
5

在我的應用程序,我把它設計有一個服務,它獲取的數據不斷(有很好的理由,這是從一些傳感器),並將其提供給兩個客戶:我應該擴展Binder類還是使用Messenger?

  • 一個UI活動,以顯示實時數據
  • 它記錄的數據

在任何時候,這兩個,一個或者沒有這些客戶端可以運行其他服務。

我認爲這個服務應該是一個綁定服務,而日誌服務是一個Started服務。

Android的documentation此說我應該延長粘合劑類,或使用Messenger的,如果我想從另一個進程訪問該服務。

此服務,日誌服務和UI活動都將在同一個APK,因此他們可能會在同一個過程 - 但什麼是打算在這裏是最好的解決辦法嗎?我懷疑這個文檔可能沒有考慮到我可以讓兩個客戶端與服務在同一個進程中的可能性。

感謝

回答

-1

伊姆蘭·罕的首選解決方案(粘合劑)做似乎工作,但最終我選擇了一個信使在實踐中,我發現這個解決方案更加靈活和符合邏輯的代碼。

9

Android的documentation明確表示
擴展粘合劑類
如果您的服務是私人自己的應用程序,並在同一個進程中的客戶端上運行(這是常見的),你應該通過擴展Binder類並從onBind()返回它的一個實例來創建你的接口。客戶端收到活頁夾並可以使用它直接訪問活頁夾實施或甚至服務中可用的公共方法。 當您的服務僅僅是您自己的應用程序的後臺工作者時,這是首選技術。您不會以這種方式創建界面的唯一原因是因爲您的服務被其他應用程序或單獨的進程使用。

使用Messenger的
如果您需要的接口在不同的工藝工作,你可以創建一個信使服務的界面。以這種方式,該服務定義了一個響應不同類型的消息對象的處理程序。這個Handler是Messenger的基礎,它可以與客戶共享一個IBinder,允許客戶使用Message對象向服務發送命令。此外,客戶端可以定義自己的Messenger,以便服務可以發回消息。 這是執行進程間通信(IPC)的最簡單方法,因爲Messenger將所有請求排入單個線程,因此您不必將您的服務設計爲線程安全。

所以,最好的選擇是通過擴展IBinder類來使用服務,當這個服務是本地服務。當通過使用MessengerAIDL創建這兩個服務時,它們都是遠程服務

+0

這會與客戶同時處理服務和活動嗎? – CNorris 2012-03-05 12:55:55

+0

是的,它適用於兩者,系統爲所有客戶端提供相同的「IBinder」 – 2012-03-05 23:11:16

相關問題