1

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 などのメソッドは、呼び出されないように見えます。明らかに何かが欠けています。何かご意見は?

どうもありがとう!

イヴァ

4

3 に答える 3

1

コードの残りの部分がないと、質問に答えるのが難しくなります。AIDL を使用してリモート サービスとそのクライアントを実装するサンプル プロジェクトのペアについては、こちらこちらを参照してください。おそらく、これらの実装により、どこで問題が発生しているのかがわかります。

于 2010-05-03T13:12:18.507 に答える
0

クラスをIPCに公開するには、.aidlファイルでクラスを指定する必要があります。

詳細については、 http://fauxgrammer.com/?p=4を参照してください。

乾杯!

于 2012-06-14T12:56:14.277 に答える