android从AIDL绑定服务返回“实时”对象

时间:2013-08-13 23:21:13

标签: android android-service ipc aidl

我想创建一个AIDL服务,由于缺少正确的术语而返回“实时”对象。也就是说,我希望这样的东西能够起作用,

IFoo foo = myService.getFoo(x); // calls to myService service to get an IFoo
IBar bar = foo.getBar(y); // IPC to IFoo to get an IBar
IBaz baz = bar.getBaz(z); // IPC to IBar to get an IBaz

baz.setEnabled(false); // IPC to IBaz to modify the service's copy of IBaz

我希望这是可能的,但我可以找到一个很好的例子。另一种方法是做一些事情,

myService.setBazEnabled(x, y, z, false);
前者是一种更为面向对象的方法,而后者则更具功能性。

感谢。

2 个答案:

答案 0 :(得分:1)

只要IFooIBarIBaz都是通过AIDL定义的,那应该可以正常使用。

答案 1 :(得分:0)

在CommonsWare的评论#2中提供明确的建议示例......

首先,定义要从主AIDL接口返回的子AIDL接口

interface IMyService {
  IFoo getFoo();
}

IFoo本身应该是AIDL接口,

interface IFoo {
  ...
}

在您的IMyService.getFoo()实现中,构建一个新的绑定器,并将其作为IFoo接口返回

public class MyService implements Service {
  public class FooBinder extends IFoo.Stub {
    ...
  }

  public class MyBinder extends IMyService.Stub {
    @Override
    public IFoo getFoo() {
      return IFoo.Stub.asInterface(new FooBinder()); 
    }

  @Override
  public IBinder onBind() {
    return new MyBinder();
  }
}