准备工作
aidl定义接口int AService.a()方法
构造对象流程
- 客户端注册服务,从ServiceConnection.onServiceConnected()中拿到IBinder对象(实际上是BinderProxy类型的对象,继承了IInterface接口)
- 通过上述的IBinder对象,new出AService.Stub.Proxy,并把上述的BinderProxy作为参数传入构造函数,并且返回这个AService.Stub.Proxy对象
- 以后的调用中,客户端通过AService.Stub.Proxy,调用BinderProxy即可
调用a方法时的流程:
客户端逻辑:
- 上述AService.Stub.Proxy对象调用a方法
- a方法调用刚才构造方法传入的BinderProxy的transact方法(传入_data和_reply作为发送数据和接收数据的容器)
- BinderProxy通过jni向下调用
服务端逻辑:
- 服务端通过jni调用AService.Stub.execTransact(code参数用来标识一个方法)(android_util_Binder.cpp的onTransact方法调用来触发这个方法)
- 调用AService.Stub.onTransact方法
- 通过AService.Stub.onTransact中的code作为条件,找到并调用AService.Stub中的a方法,但AService.Stub中没有a方法,调用AService中的a方法
重点:
BinderProxy是远程Binder对客户端暴露的代理对象