AIDL を使用してアクティビティからサービスにオブジェクトを渡していますが、奇妙な動作が発生しています。私の理解では、AIDL の背後にあるアイデアは、.aidl ファイルにインターフェイスを作成することです。これにより、Android は動的に生成されたクラスに (部分的に) 実装します。Android は Stub と呼ばれる抽象クラスを作成します。これをインスタンス化し、.aidl インターフェイスで定義したメソッドの実装を追加する必要があります。すべてが整ったら、リモート サービスをインスタンス化し、.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 などのメソッドは、呼び出されないように見えます。明らかに何かが欠けています。何かご意見は?
どうもありがとう!
イヴァ