APP调用bindService的跨进程调用过程

app执行bindService时会经过如下8次跨系统进程调用过程:

第1步:通过AMS.getService跨进程调用

第2步:AMS返回它的IBinder

第3步:通过AMS的IBinder调用AMS的bindService方法

第4步:而AMS存放有Server端的IBinder,所以可以调用Server的服务即schduleBindService()

第5步:server收到schduleBindService()后不能直接把它的IBinder发给Client,它也只能通过AMS,所以它调用AMS的getService获取AMS服务

第6点:AMS返回它的IBinder给Server

第7步:Server调用AMS的publishService服务,将Server的IBinder发送给Client,通过调用client的connected()接口

下面为整体流程代码:
源头:APP调用bindservice时,会进入下面的流程。

    

ContextImpl.java
    ->bindserviceCommon()
        //获取AMS的服务,跨进程通信,走到AMS服务
        ->ActivityManager.getService().bindIsolatedService()
        上面接口是进入ActivityManager.java的getService():
            ->获取服务的过程是获取AMS的binder的接口,为IActivityManager,是一个内部类
            final IBinder b =  ServiceManager.getService(context.ACTIVITY_SERVICE);
            //也是通过asInterface转化为proxy这个给客户端用的binder代理
            final IActivityManager am = IActivityManager.Stub.asInterface(b);   
            return am;


        然后开始调用bindIsolatedService()了->ActivityManagerService的接口
        ActivityManagerService.java:bindIsolatedService()
            mServices.bindServiceLocked();
                requestServiceBindingLocked();
                -->ServiceRecord r; //对象表示一个Service.
                   //跳转到ActivityThread.java,其中app.thread是进入ActivityThread.java的main()去创建
                   r.app.thread.scheduleBinderService();
                       //向ActivityThread发消息,转到ActivityThread.HandleBindService()去处理消息。
                       sendMessage(H.BIND_SERVICE,s); 



//上面的r.app.thread的创建过程。
ActivityThread.java的main():
    ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);



ActivityThread.java->handleBindService():
    //目的是要把AMS的binder传给APP,即Activity.
    //拿到AMS的binder,然后调用它的publishService方法将Server端的binder送出去。
    IBinder binder = s.onBind(data.intent);
    ActivityManager.getService().publishService(binder);
    //这里就进入AMS的publishService(binder)方法:
        mServices.publishServiceLocked(service);
              b.binder = service //上面的IBinder对象binder.
              b.request = true;
              connectionRecord c = clist.get(i) ;//获取
              c.conn.connected(r.name, service, false); //调用activity中的connected接口回调onServiceConnected方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/91141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT在医疗系统的应用探索动态

注意:本信息仅供参考,发布该内容旨在传递更多信息的目的,并不意味着赞同其观点或证实其说法。 生成式人工智能,如OpenAI开发的ChatGPT,被认为是可以颠覆医疗行业的工具。尽管该技术刚刚起步,但已有许多医…

Vue2向Vue3过度Vuex核心概念mutations

目录 1 核心概念-mutations1.定义mutations2.格式说明3.组件中提交 mutations4.练习5.总结 2 带参数的 mutations1.目标:2.语法2.1 提供mutation函数(带参数)2.2 提交mutation 3 练习-mutations的减法功能1.步骤2.代码实现 4 练习-Vuex中的值…

kettle实现爬虫

步骤概览 获取请求 请求地址 东方财富网股票请求 自定义常量数据 获取HTTP请求之前,必须先定义一个URL常量作为HTTP client的输入 HTTP client 注:此处得到的数据并不是原生的json字符串,自己可以用文本文件输出测试以下。如下图 JavaScri…

Vue2向Vue3过度核心技术路由

目录 1 路由介绍1.思考2.路由的介绍3.总结 2 路由的基本使用1.目标2.作用3.说明4.官网5.VueRouter的使用(52)6.代码示例7.两个核心步骤8.总结 3 组件的存放目录问题1.组件分类2.存放目录3.总结 4 路由的封装抽离5 Vue路由-重定向1.问题2.解决方案3.语法4…

谈谈子网划分的定义、作用、划分方式以及案例

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、子网划分的定义 二、子网掩码的作用 1、…

林业气象站——林业种植气象观测

林业气象站是一种用于观测林区气象环境的仪器,能够观测林区天气、土壤等自然环境参数(温度、湿度、风速、风向、降雨量、气压、放射线、土壤湿度等),为开展环境观测、天气预报、灾害预警、林区虫害防治起到综合指导作用。 林业气…

Unity中的数学基础——贝塞尔曲线

一:前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn,n1为线性,n2为二次......第一个和最后一个控制点称为起点和终点,中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值( Mathf.Lerp&#xff09…

基于Python+djangoAI 农作物病虫害预警系统智能识别系统设计与实现(源码&教程)

1.背景 随着科技的发展,机器学习技术在各个领域中的应用越来越广泛。在农业领域,机器学习技术的应用有助于提高农作物的产量和质量,降低农业生产的成本。本文针对农作物健康识别问题,提出一种基于机器学习方法的农作健康识别系统&…

FOC之SVPWM学习笔记

一、参考资料 【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎FOC入门教程_zheng是在下的博客-CSDN博客DengFOC官方文档技术干货 |【自制】FOC驱动板SVPWM_扇区判断_时间计算_哔哩哔哩_bilibili 二、FOC控制算法流程框图 在FOC控制中主要用到三个PID环,从内…

picGo+gitee+typora设置图床

picGogiteetypora设置图床 picGogitee设置图床下载picGo软件安装picGo软件gitee操作在gitee中创建仓库在gitee中配置私人令牌 配置picGo在插件设置中搜索gitee插件并进行下载 TyporapicGo设置Typora 下载Typora进行图像设置 picGogitee设置图床 当我了解picGogitee可以设置图床…

基础论文学习(2)——DETR

目标检测 DETR:End-to-End Detection with Transformer detr是facebook提出的引入transformer到目标检测领域的算法,效果很好,做法也很简单,相较于RCNN和YOLO系列算法,避免了Proposal/AnchorNMS的复杂流程。 1. detr…

网络安全在医疗行业中的重要性

不可否认,现代世界见证了技术和医疗行业的交织,塑造了我们诊断、治疗和管理健康状况的新方式。随着电子健康记录取代纸质文件,远程医疗缩短了患者和医疗服务提供者之间的距离,数字化转型既是福音,也是挑战。最近的全球…

数据库三大范式是什么,又为什么要反范式?

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

opencv/C++ 人脸检测

前言 本文使用的测试资源说明: opencv版本:opencv 4.6.0 人脸检测算法 Haar特征分类器 Haar特征分类器是一个XML文件,描述了人体各个部位的Haar特征值。包括:人脸、眼睛、鼻子、嘴等。 opencv 4.6.0自带的Haar特征分类器&…

vue3+uni——watch监听props中的数据(组件参数接收与传递defineProps、defineEmits)

案例说明 A页面引用的子组件B A页面 <template><view>//引用组件<serviceOrder change"change" :list"list" :current"type"></serviceOrder></view> </template><script setup>import serviceOrd…

SpringCloud超详细教程

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

vue中实现echarts三维散点图

需要安装 echarts 同时引入 echarts-gl 我安装的版本&#xff1a; "echarts": "^5.3.2", "echarts-gl": "^2.0.9", import Vue from "vue"; import * as echarts from "echarts"; Vue.prototype.$echarts echa…

Spring 学习源码的基础 核心原理与核心概念

文章目录 核心原理AnnotationConfigApplicationContextIoC 容器加载流程Spring 中如何创建一个对象Bean 的创建过程 (生命周期)单例 原型推断构造方法依赖注入AOP 动态代理判断是否需要 AOP 的大致流程CGLib 做 AOP 的大致流程事务事务代理对象执行方法的流程事务注解排至失效的…

使用yapi生成漂亮接口文档

YApi-教程 1. 进入yapi 的菜单 2. 从微服务中导出swagger的json 从浏览器页面访问http://localhost:端口/服务/swagger-ui.html&#xff0c;然后打开浏览器的控制台&#xff0c;查看network&#xff0c;刷新下页面&#xff0c;找到XHR中的api-docs&#xff0c;然后查看res…

基于Java+SpringBoot+Vue前后端分离公交线路查询系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…