Android IPC问题,onBind()返回的Binder类型对象是在什么时候变成onServiceConnected中的BinderProxy对象的呢?

codog2017 2017-09-03 04:11:34
正在研究Android中的Binder机制,我想问的是在调用远程服务时,Service中onBind()返回的Binder类型对象,是在什么时候变成onServiceConnected()中的BinderProxy类型的对象呢?
看了《Android开发艺术探索》,在绑定服务的过程中,ActivityThread的handleBindService方法回调了Service的onBind()方法,并把onBind返回的IBinder类型对象(此时类型为Binder)交给了AMS的publishService方法,几经辗转后回调了Activity中ServiceConnection的onServiceConnected方法,并传入了这个上边说的那个IBinder对象,但是这个时候它的类型已经变成了BinderProxy类型了。
我觉得这个BinderProxy应该是Client向SM查询后得到的,但是这个过程具体发生在哪里呢?
...全文
6046 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
悠然红茶 2020-11-19
  • 打赏
  • 举报
回复
如果有兴趣的话,可以阅读一下我以前写的《Android Service演义》一文,应该可以基本回答你的问题。
jzp12 2020-11-19
  • 打赏
  • 举报
回复
要理解这个问题, 先要知道Java层和C++层类的对应关系: BinderProxy(Java) <--> BpProxy(C++) 并且知道BinderProxy类是Native层与framework层之间的相互调用的桥梁, 简单的说就是,从客户端往服务端调用时,是把Java层的BinderProxy对象转换成Native层的BpBinder对象 从服务端往客户端调用时,是Native层的BpBinder对象把转换成Java层的BinderProxy对象 这个过程是在jni层完成的,具体代码请参考: frameworks/base/core/jni/android_util_Binder.cpp
小鱼人爱编程 2020-11-18
  • 打赏
  • 举报
回复
Parcel本身在读写IBinder的时候会转换 https://www.jianshu.com/p/b39ffcbcb7b7
诸神黄昏EX 2020-08-24
  • 打赏
  • 举报
回复
居然没有一个大神能够回答这个问题,我研究好几天了,发现返回的IBinder直接调用了ServiceRecord.onBind,即直接返回了Service的onBind方法返回值,在AIDL跨进程通信中,就是一个IXXX.Stub,跟踪后面的publishService流程,并没有发现将它转换成BinderProxy?无语的很,居然没有一篇文章讲解这个问题
飞雷鸣 2019-09-14
  • 打赏
  • 举报
回复
这个问题问得很好啊,如果是跨进程绑定service的话在onServiceConnection中获得确实bindProxy类型的对象,在同进程的时候获得的是Binder类型的,我也想知道是为什么?
codog2017 2017-09-05
  • 打赏
  • 举报
回复
大神在哪里,

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧