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对客户端暴露的代理对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文:http://weishu.me/2016/01/12/binder-index-for-newer/ 要点...
    指尖流逝的青春阅读 2,618评论 0 13
  • 毫不夸张地说,Binder是Android系统中最重要的特性之一;正如其名“粘合剂”所喻,它是系统间各个组件的桥梁...
    weishu阅读 17,924评论 29 246
  • Binder简析 直观来说,Binder 是 Android 中的一个类,是继承了 IBinder 接口;从 IP...
    任教主来也阅读 2,071评论 0 3
  • 前言 稍微看过Android FrameWork层的人应该都知道Binder,因为app与系统服务之间的通信基本上...
    半栈工程师阅读 2,911评论 6 33
  • 最近天热,工作遭遇一个老妖婆叼难,促使我必须努力,不然境况会很糟糕。待人接物,脾气不大好了,希望自己可以好好学习努...
    挨踢的瑜伽行者阅读 259评论 0 0