2010-05-03 72 views
1

我正在使用AIDL將活動中的對象傳遞給服務,並且出現了一些奇怪的行爲。據我瞭解,AIDL背後的想法是在.aidl文件中創建一個接口,然後android將(部分)在一個動態生成的類中實現該接口。 Android將創建一個名爲Stub的抽象類,然後您需要實例化並添加您在.aidl接口中定義的方法的實現。一旦完成所有這些工作,就可以實例化遠程服務,並且可以調用在.aidl接口文件中聲明的方法(並且在Stub類的實例化中定義的方法)。AIDL:未調用存根類方法

這是我對這種機制如何工作的印象,但是當我嘗試實現它時,我注意到我在Stub類中聲明的方法的定義沒有運行;而不是什麼正在運行的是IBinder.transct()

這裏是我想要做的一個片段:

這是在我的服務實現:

public final INetService.Stub mBinder = new INetService.Stub() { 

     public void sendInteger(String ID, int data) throws RemoteException { 
     // TODO Auto-generated method stub 

    } 

    public void sendString(String ID, String data) throws RemoteException { 
     ServiceConnectionHandler connHandler = new  ServiceConnectionHandler(ID, data); 
    } 

    public void sendObject(String ID, NetMessage data) throws RemoteException { 
     ServiceConnectionHandler connHandler = new ServiceConnectionHandler(ID, data.getData()); 
    } 

}; 

這裏面我的活動,它試圖用,跟我們的服務:

private INetService mService = null; 
private NetServiceConnection conn = null; 

class NetServiceConnection implements ServiceConnection 
{ 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     mService = INetService.Stub.asInterface(service); 
      Log.d("ADDERSERVICECLIENT","onServiceConnected"); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     mService = null; 
     Log.d("ADDERSERVICECLIENT","onServiceDisconnected"); 
    } 
}; 

private void initService() 
{ 
    conn = new NetServiceConnection(); 
    Intent i = new Intent(); 
    i.setClassName("framework.network", "framework.network.NetService"); 
    if (!bindService(i, conn, Context.BIND_AUTO_CREATE)) 
    { 
     Toast.makeText(this, "bindService fails..", Toast.LENGTH_LONG).show(); 
    } 
} 

.... 

mService.sendString((char)0, finalMessage); 

的方法INetService.Stub定義,像sendString,似乎永遠不會被調用;顯然我錯過了一些東西;有什麼想法嗎?

非常感謝!

Iva

回答

1

沒有剩下的代碼,很難回答你的問題。請參閱herehere,瞭解使用AIDL實現遠程服務及其客戶端的一對示例項目。也許這些實現會給你一些關於你的錯在哪裏的想法。

0

今天早些時候我遇到了同樣的情況。就我而言,我在客戶端和服務器端有兩份AIDL文件。

我正在更新客戶端的AIDL文件,但完全忘記了更新服務器端AIDL。由於沒有類型檢查存根實施它只是運行,但從來沒有返回任何東西。