1

我想创建一个 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);

前者是一种更面向对象的方法,而后者更实用。

4

2 回答 2

1

只要IFoo, IBar, 和IBaz都是通过 AIDL 定义的,那应该可以正常工作。

于 2013-08-13T23:24:20.063 回答
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();
  }
}
于 2013-08-14T01:14:47.537 回答