2016-03-02 35 views
2

我正在實現一個服務,並在本地綁定它的服務上有一個包裝類。現在,當我將該服務作爲jar導出並從另一個應用程序鏈接到該應用程序時(此應用程序實例化包裝類)。 當我運行應用程序時,我收到ClassCastException異常:android.os.BinderProxy不能轉換到XXX單位包裝類引起局部綁定$ LocalBinder :

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

這裏的粘結劑類型的BinderProxy而不是localbinder,從而導致崩潰。

此應用程序的唯一工作方式是應用程序的包名稱與服務包名稱相同(我認爲android認爲該服務是本地的)。

private final IBinder localBinder = new LocalBinder(); 
    public class LocalBinder extends Binder { 
    xxxService getService() { 
     return xxxService.this; 
    } 
} 

public IBinder onBind(Intent intent) { 
    IBinder result = null; 
    result = localbinder; 
    return result; 
} 
在我的包裝類

然後onServiceConnected:

public void onServiceConnected(ComponentName name, IBinder binder) { 

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

最後我的包裝類的構造函數:

public xxxServiceManager(Context context) throws Exception { 
    this.context = context; 
    xxxServiceManagerIntent = new Intent("providerAPI"); 
    xxxServiceManagerIntent.setClassName("com.yyy", "com.yyy.xxxService"); 

    context.startService(xxxServiceManagerIntent); 


    context.bindService(xxxServiceManagerIntent, serviceConnection, Context.BIND_AUTO_CREATE); 

然後在主應用程序,使用該罐子,如果你設置包名

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.yyy.provider" //the same as the service (which does not make sense) 

一切正常,但顯然我想設置另一個包的名稱。 有什麼辦法可以重新設計或完成這項工作嗎?

謝謝!

+1

更多源代碼將是有幫助的。你的服務(特別是'onBind()'方法和你的'LocalBinder'類)和你的綁定代碼可以揭示很多關於問題的原因。 –

+0

將您的代碼添加到您的原始問題會更好。這將是更可讀的方式,你不需要擔心評論的字符限制。 –

+0

希望現在更清楚..感謝您的幫助! –

回答

3

看到this

如果您的服務僅用於本地應用,不需要跨進程的工作,那麼你就可以實現自己的活頁夾類,提供了對服務的公共方法您的客戶端直接訪問。

注意:僅當客戶端和服務處於相同的 應用程序和進程中時纔有效,這是最常見的。例如,這將 適用於音樂應用程序,該應用程序需要將活動綁定到自己的服務,該服務在後臺播放音樂。

相關問題