Android Binder调用

准备工作

aidl定义接口int AService.a()方法

构造对象流程

  1. 客户端注册服务,从ServiceConnection.onServiceConnected()中拿到IBinder对象(实际上是BinderProxy类型的对象,继承了IInterface接口)
  2. 通过上述的IBinder对象,new出AService.Stub.Proxy,并把上述的BinderProxy作为参数传入构造函数,并且返回这个AService.Stub.Proxy对象
  3. 以后的调用中,客户端通过AService.Stub.Proxy,调用BinderProxy即可

调用a方法时的流程:

客户端逻辑:

  1. 上述AService.Stub.Proxy对象调用a方法
  2. a方法调用刚才构造方法传入的BinderProxy的transact方法(传入_data和_reply作为发送数据和接收数据的容器)
  3. BinderProxy通过jni向下调用

服务端逻辑:

  1. 服务端通过jni调用AService.Stub.execTransact(code参数用来标识一个方法)(android_util_Binder.cpp的onTransact方法调用来触发这个方法)
  2. 调用AService.Stub.onTransact方法
  3. 通过AService.Stub.onTransact中的code作为条件,找到并调用AService.Stub中的a方法,但AService.Stub中没有a方法,调用AService中的a方法

重点:

BinderProxy是远程Binder对客户端暴露的代理对象

你可能感兴趣的:(Android Binder调用)