客户端调用bindService怎么让服务端的binder回调过来的?

 

使用的是plantUML生成的,脚本如下:

@startuml
autonumber
title bindService之拿到服务端的binder
App绑定服务 -> ContextImp: bindService// 服务端的binder对象最终回调到onServiceConnected中
ContextImp -> ContextImp: bindServiceCommon
ContextImp -> LoadedApk:getServiceDispatcher():IServiceConnection
ContextImp -> ActivityManager: getService():ActivityManagerService
ContextImp -> ActivityManagerService: bindIsolatedService
ActivityManagerService -> ActiveServices:bindServiceLocked()
ActiveServices -> ActiveServices:retrieveServiceLocked// 从PackageManager中得到服务端对应的ServiceRecord
ActiveServices -> ActiveServices:bringUpServiceLocked//如果是autoCreate的flag的话调用这个方法,会开始创建服务,\n并在ActivityThread中的mServices里面管理
ActiveServices -> ActiveServices: 检查权限和参数
ActiveServices ->  ConnectionRecord:构造方法(connection:IServiceConnection)
ActiveServices ->  IServiceConnection:asBinder():连接LoadApk的内部类对象:InnerConnection赋值给service
group 冷启动服务
    ActiveServices-> ActiveServices:requestServiceBindingLocked
    ActiveServices -> ActivityThread.ApplicationThread: scheduleBindService
    ActivityThread.ApplicationThread -> ActivityThread: handleBindService
    ActivityThread -> Service:onBind(data.intent)// 得到服务端binder,
    ActivityThread -> ActivityManagerService: publishService
    ActivityManagerService -> ActiveServices: publishServiceLocked
    ActivityManagerService -> LoadedApk.ServiceDispatcher.InnerConnection: connect()
    LoadedApk.ServiceDispatcher.InnerConnection -> LoadedApk.ServiceDispatcher:doConnected
    LoadedApk.ServiceDispatcher -> ServiceConnection:onServiceConnected(name, binder)
end

@enduml

看了下源代码,梳理了上面流程,主要是解答我一直以来的困惑,就是这个binderService怎么就能拿到服务端的binder呢?他怎么就算是跨进程呢?

梳理完后,其实就是ActiveServices和ActivityThread和PackageMangerService把服务端的binder找出来。如果没有就创建,然后调用这个服务的onBind方法。如果已经绑定过了,就直接把缓存中的binder对象拿出来回调到客户端,所以很多个客户端拿到的都是同一个binder。

 发现一个写得挺好挺详细的博客,可以跟着这个博客看源码:(57条消息) 由浅入深 学习 Android Binder(一)- AIDL_许佳佳的博客-CSDN博客icon-default.png?t=M1L8https://blog.csdn.net/Double2hao/article/details/109865496

下一篇打算找找为什么拿到的binder对象可以用客户端那个接口来强转,它不是两个接口文件吗?这样也能强转吗?还有就是为什么说binder只用复制一次的,到底是在哪里复制的呢?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值