2013-02-26 120 views
0

我需要一些幫助來通過擴展Binder類來綁定服務。綁定來自不同APK的服務

我有2個APK。第一個聲明一個服務,我想從第二個APK的活動中綁定它。

這兩個APK都使用相同的sharedUserId和相同的android:進程。因爲它們在同一個進程中運行,所以我不想使用AIDL進行IPC通信(我已經嘗試過,它正在工作,但我不想使用它,因爲我只使用一個進程)。

我就可以開始/綁定的服務,但我不能得到的參考服務:

LocalBinder binder = (LocalBinder); 
mService = binder.getService(); 

我得到異常:

E/AndroidRuntime(6145): java.lang.ClassCastException: 

是由可以綁定的服務在我的情況下擴大IBinder類?

感謝

回答

0

我從來沒有試過,但我懷疑每一個apk文件正在使用自己的ClassLoader加載。這意味着Dalvik虛擬機會將每個.apk中具有相同名稱的兩個相同的類視爲完全不同的類。

我相信你會發現這是不可能解決的。

因此,您應該使用aidl。我想你對aidl有兩個反對意見。

  • 你可能不想花時間編組所有的數據到Parcelable類,等等。然而,如上所述,我不相信你可能會找到一種方法,直接傳遞數據作爲Java兩個.apks之間的對象,即使在同一個進程中運行,所以你別無選擇。
  • 也許你擔心表演。但是你不需要擔心,因爲Binder調用(包括aidl調用)當它們處於同一個進程中時,只會變成普通的函數調用。
0

使用信使:這是執行進程間通信(IPC)最簡單的方法,因爲信使隊列中的所有請求到一個單一的線程,這樣你就不必來設計你的服務是線程安全的。

如果您需要您的界面跨不同的進程(意味着不同的APK),您可以使用Messenger創建服務界面。以這種方式,該服務定義了一個響應不同類型的消息對象的處理程序。這個Handler是Messenger的基礎,它可以與客戶共享一個IBinder,允許客戶使用Message對象向服務發送命令。另外,客戶端可以定義它自己的Messenger,這樣服務可以發回消息。

如果您需要您的服務與遠程進程進行通信,那麼您可以使用Messenger爲您的服務提供接口。這種技術允許您執行進程間通信(IPC)而無需使用AIDL。

這裏有一個使者如何使用的總結:

服務實現了接收來自客戶端每次調用回調處理程序。 服務使用Handler創建一個Messenger對象(這是對Handler的引用)。 Messenger創建一個IBinder,該服務從onBind()返回給客戶端。 客戶端使用IBinder實例化Messenger(引用服務的處理程序),客戶端用它將Message對象發送到服務。 服務在HandlerMessage()方法中專門接收Handler中的每條消息。

這樣,客戶端無法調用該服務。相反,客戶端傳送服務在其處理程序中接收的消息(消息對象)。

相關問題