【问题标题】:AIDL: Stub class methods not being calledAIDL:未调用存根类方法
【发布时间】:2010-05-03 07:40:30
【问题描述】:

我正在使用 AIDL 将对象从 Activity 传递到 Service,并且出现了一些奇怪的行为。据我了解,AIDL 背后的想法是在 .aidl 文件中创建一个接口,然后 android 将在动态生成的类中(部分)实现该接口。 Android 将创建一个名为 Stub 的抽象类,然后您需要实例化并添加您在 .aidl 接口中定义的方法的实现。一旦所有这些都准备就绪,就可以实例化远程服务,并且可以调用在 .aidl 接口文件中声明的方法(并在您的 Stub 类的实例中定义)。

这是我对这个机制如何工作的印象,但是当我尝试实现它时,我注意到我在 Stub 类中声明的方法的定义没有运行;相反,正在运行的是 IBinder.transct()

这是我正在尝试做的一个 sn-p:

这是在我的服务中实现的:

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());
    }

};

这是在我的 Activity 中,它尝试使用该服务并与之对话:

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,似乎永远不会被调用;显然我错过了一些东西;有什么想法吗?

非常感谢!

伊娃

【问题讨论】:

    标签: android aidl


    【解决方案1】:

    没有其余代码,很难回答您的问题。请参阅herehere,了解使用 AIDL 实现远程服务及其客户端的一对示例项目。也许这些实现会让您了解问题出在哪里。

    【讨论】:

      【解决方案2】:

      您必须在 .aidl 文件中指定您的类以将其公开给 IPC。

      更多信息请参见http://fauxgrammer.com/?p=4

      干杯!

      【讨论】:

        【解决方案3】:

        我今天早些时候遇到了同样的情况。就我而言,我在客户端和服务器端有两个 AIDL 文件副本。

        我在客户端更新 AIDL 文件,但完全忘记更新服务器端 AIDL。由于没有对 Stub 实现进行类型检查,它只是运行但从未返回任何内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 2021-06-10
          • 2014-01-31
          相关资源
          最近更新 更多