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

news2024/11/15 13:54:53

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方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:101-120)

第101题 可用于多种路由协议,由 ​​if-match​​​和 ​​apply​​子句组成的路由选择工具是 A、​​route-policy​​ B、​​IP-Prefix​​ C、​​commnityfilter​​ D、​​as-path-filter​​ 答案:A 解析: Route-policy(路由策…

扫雷小游戏

目录 一.扫雷小游戏 二.游戏主体一览 ​编辑 三.模块化设计扫雷游戏 3.1打印欢迎菜单 3.2创建两个二维数组 3.3棋盘稍加修改 3.4布置雷 3.5排查雷 四.游戏总体代码 4.1game.h头文件 4.2game.c函数实现源文件 4.3游戏main函数主体 五.游戏效果图 一.扫雷小游戏 这是…

EB Tresos第一个项目报13026

EB项目创建 前期的准备工作见以上这篇文章,不做过多叙述;但是点击Generate Project会报错,报错如下: Code generator finished. Errors “1” Warnings “0” 然后点击 Problems View 查看提示,提示如下: …

大数据:AI大模型对数据分析领域的颠覆(文末送书)

随着数字化时代的到来,大数据已经成为了各行各业中不可或缺的资源。然而,有效地分析和利用大数据仍然是一个挑战。在这个背景下,OpenAI推出的Code Interpreter正在对数据分析领域进行颠覆性的影响。 如何颠覆数据分析领域?带着这…

为什么Python列表和字典前面会加星号(**)?

目录标题 前言一、列表(list)、元组(tuple)前面加星号*二、字典(dict)前面加两星号**尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! Python 中,单星号*和双星号**除了作为“乘”和“…

视频汇聚/云存储/安防监控AI视频智能分析平台——明厨亮灶解决方案

人工智能技术已经越来越多地融入到视频监控领域中,近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能,该平台内置多种AI算法,可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍,支持人脸检测、…

算法 for GAMES

栈 #include <iostream> #include <stack>int main() {std::stack<int> intStack;// 压入元素到堆栈intStack.push(5);intStack.push(10);intStack.push(15);// 查看堆栈顶部元素std::cout << "Top element: " << intStack.top() <…

虚虚实实,让敌人难以琢磨

与敌作战&#xff0c;虚虚实实&#xff0c;难以琢磨 【安志强趣讲《孙子兵法》第20讲】 第六篇&#xff1a;虚实篇 【全篇趣讲白话】 打仗就是要虚虚实实&#xff0c;让敌人难以琢磨。 【原文】 孙子曰&#xff1a;凡先处战地而待敌者佚&#xff0c;后处战地而趋战者劳。故善…

Locked勒索病毒:最新变种locked袭击了您的计算机?

导言&#xff1a; 在数字时代&#xff0c;一场隐秘的威胁正悄然而至&#xff0c;它的名字是.locked勒索病毒。这个黑暗的存在以其狡猾的攻击方式和致命的数据封锁能力&#xff0c;威胁着我们的数字生活。本文91数据恢复将带您深入了解.locked勒索病毒的本质&#xff0c;探索恢…

【Day-20慢就是快】代码随想录-栈与队列-有效的括号

给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被…

Redis7安装

1. 使用什么系统安装redis 由于企业里面做Redis开发&#xff0c;99%都是Linux版的运用和安装&#xff0c;几乎不会涉及到Windows版&#xff0c;上一步的讲解只是为了知识的完整性&#xff0c;Windows版不作为重点&#xff0c;同学可以下去自己玩&#xff0c;企业实战就认一个版…

会声会影2023全新中文专业版下载安装教程

熟练使用会声会影视频编辑工具&#xff0c;对视频创作过程的帮助是极大的。大家可以放心大胆地去研究会声会影的视频编辑技巧&#xff0c;会声会影2023与以往版本会声会影版本最大的区别是&#xff1a;账户制管理。可以通过账户添加或移除设备&#xff0c;非常便捷。该软件一直…

Vue2向Vue3过度Vuex核心概念mutations

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

05.Image Captioning with Semantic Attention

目录 前言泛读摘要Introduction创新/贡献点Related Work 精读输入的注意力模型输出的注意力模型模型学习视觉属性/概念预测实验MS-COCO的性能实验分析 Conclusion 代码略 前言 本课程来自深度之眼《多模态》训练营&#xff0c;部分截图来自课程视频。 文章标题&#xff1a;Ima…

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比

多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比 目录 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预…

用AI + Milvus Cloud搭建着装搭配推荐系统教程

以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…

智能文件批量改名工具,覆盖复制时轻松处理相同文件名!

亲爱的用户们&#xff0c;您是否在批量复制文件时常常被相同文件名困扰&#xff0c;手动一个个改名繁琐又费时&#xff1f;现在&#xff0c;我们为您推出一款智能的文件批量改名工具&#xff0c;帮助您轻松处理复制时的相同文件名&#xff0c;让文件管理更从容&#xff01; 首…

建设全球研发中心城市,长沙政协将会发挥怎样的作用?

政协力量&#xff0c;会如何推动一座城市的发展&#xff1f;在全国各大城市都力“拼经济、搞创新”的时代大背景下&#xff0c;人民政协的力量会如何助推长沙建设全球研发中心城市呢&#xff1f; 这是笔者此前一直很好奇的两个问题。8月24日&#xff0c;一场由长沙市政协举办的…

bex5-设计器连接本地BIZModel

注意platformRcp-new&#xff08;设计器&#xff09;与BIZModel要配套&#xff0c;不可版本不一致&#xff1b; tomcat启动使用jdk1.7 BIZModel修改数据源 在\BeX5_V3.6-ent-20210418\runtime\BizModel\WEB-INF\conf目录下修改database.xml中改为项目使用的数据源 web.xml中…

解决无法远程连接MySQL服务的问题

① 设置MySQL中root用户的权限&#xff1a; [rootnginx-dev etc]# mysql -uroot -pRoot123 mysql> use mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY Root123 WITH GRANT OPTION; mysql> select host,user,authentication_string from user; -…