IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 客户端调用bindService怎么让服务端的binder回调过来的? -> 正文阅读

[JavaScript知识库]客户端调用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只用复制一次的,到底是在哪里复制的呢?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:27:11  更:2022-03-04 15:28:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:04:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码