Android Framework 之 ServiceManager

Android ServiceManager

ServiceManager 在 Android 系统中扮演了核心的角色。主要负责跨进程通信(IPC)的管理和服务的注册与查找。

管理系统服务ServiceManager 提供一个全局的服务注册表,用于存储所有的系统服务。一个服务一旦被注册到 ServiceManager,其他的进程就可以通过 **ServiceManager **来访问这个服务。

提供服务查找功能:ServiceManager 提供 getService() 和 **checkService() **方法,可以通过服务名称来查找服务。其他进程可以通过这些方法获取到已经注册的服务的引用,然后进行跨进程通信。

负责跨进程通信:ServiceManager 提供 IPC 机制,可以让其他进程通过 Binder 机制来访问已经注册的服务,实现进程间的通信。

启动流程

设备启动:首先,设备启动并运行 bootloader,然后启动 Linux 内核。

启动 init 进程Linux 内核启动后,会启动 init 进程。init 进程是 Android 系统中的第一个进程,负责初始化系统环境,并启动其他的系统服务和进程。

启动 Zygote 进程init 进程会启动一系列的 native daemons,包括 Zygote 进程。Zygote 进程是所有 Android 应用进程的父进程,负责孵化新的应用进程。

启动 SystemServer 进程Zygote 进程会孵化出 SystemServer 进程。SystemServer 进程负责启动和管理系统级服务,包括 ServiceManager。

启动 ServiceManagerSystemServer 进程在启动过程中,会启动 ServiceManager,并将各种系统服务注册到 **ServiceManager **中。

以上就是 ServiceManager 的启动流程。在这个流程中,ServiceManager 是由 SystemServer 进程启动的,然后通过 ServiceManager 来管理和调度所有的系统服务。

核心原理

ServiceManager 是 Android 系统中负责管理所有 Binder 服务的核心部分。它的主要作用是管理和调度系统中所有的 Binder 服务,包括系统服务(如 ActivityManagerServiceWindowManagerService 等)和第三方服务。它提供了一种机制,使得一个进程可以通过 Binder 跨进程调用另一个进程中的服务。

ServiceManager 本身也是一个 Binder 服务,其他服务或应用可以通过它获取系统中已注册的 Binder 服务。

ServiceManager 的启动流程:

启动ServiceManagerSystemServer 进程在启动过程中初始化和启动。在 SystemServercreateSystemContext 方法中,会创建一个 ServiceManager 的实例。

注册服务:在 SystemServer 启动各种系统服务的过程中,这些服务的 Binder 会被注册到 ServiceManager 中,这样其他进程就可以通过 ServiceManager 获取这些服务。

ServiceManager 的工作流程:

注册服务:当一个 Binder 服务启动时,它会调用 ServiceManageraddService 方法将自己注册到 ServiceManager 中。

获取服务:当一个进程需要使用某个 Binder 服务时,它会调用 ServiceManagergetService 方法,ServiceManager 会返回对应的 Binder 对象,这样该进程就可以通过 Binder 调用服务中的方法了。

监听服务:一个进程可以调用 ServiceManageraddServiceListener 方法来监听某个服务的状态,例如监听服务是否已启动。

总的来说,ServiceManager 在 Android 系统中扮演着 “服务的服务” 的角色,它负责管理和调度系统中所有的 Binder 服务,使得进程间的通信和交互成为可能。

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

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

相关文章

windows11编译VideoProcessingFramework库

1、下载VideoProcessingFramework Release v2.0.0 NVIDIA/VideoProcessingFramework GitHub 2、下载FFMPEG Releases BtbN/FFmpeg-Builds GitHub 推荐 ffmpeg-n4.4-latest-win64-lgpl-shared-4.4 3、下载CMAKE Download | CMake 4、下载visual studio 2019 Visual …

C# FTP下载 采用Ssh.Net方式

不要再用FTPClient了 nuget下载Ssh.Net 然后代码如下&#xff1a; /// <summary>/// SFTP操作类/// </summary>public class SFTPHelper{#region 字段或属性private SftpClient sftp;/// <summary>/// SFTP连接状态/// </summary>public bool Conne…

98. Python基础教程:try...except...finally语句

【目录】 文章目录 1. try...except...finally语法介绍2. try...except...finally执行顺序3. 捕获特定类型的异常4. 捕获所有类型的异常5. 实操练习-打开txt文件并输出文件内容 【正文】 在今天的课程中&#xff0c;我们将学习Python中的异常处理语句try...except...finally。 …

Oracle也有回收站

在数据库管理中&#xff0c;数据的删除是一个常见的操作。然而&#xff0c;有时候我们可能会意外地删除了一些重要的数据。幸运的是&#xff0c;Oracle数据库提供了一个类似于回收站的功能&#xff0c;可以帮助我们恢复被删除的数据。本文将介绍Oracle数据库中的回收站功能以及…

深度学习实际使用经验总结

以下仅是个人在使用过程中的经验总结&#xff0c;请谨慎参考。 常用算法总结 图像分类 常用算法&#xff08;可作为其他任务的骨干网络&#xff09;&#xff1a;服务端&#xff1a;VGG、ResNet、ResNeXt、DenseNet移动端&#xff1a;MobileNet、ShuffleNet等适用场景&#x…

如何使用fiddler进行抓包

首先需要下载fiddler&#xff0c;推荐使用bing搜索引擎搜索&#xff08;百度搜狗一般搜这种工具展示的前几个全都是广告&#xff09;&#xff0c;直接搜索fiddler&#xff0c;搜出来第一个fiddler官网 然后直接点击download下载 进入下载页面后&#xff0c;正确填写一个邮箱&a…

linux 动态库so相关操作

1. 查看库版本号 一般在文件名上有版本号&#xff0c;若文件名上没有版本号&#xff0c;使用如下命令查看&#xff1a; readelf -d libstdc.so 2. 查看库内函数 a) nm -d libstdc.so | grep 内容 b) objdump -tT libstdc.so | grep 内容 c) readelf -s libstdc.so | grep…

通用版Bubble_sort

❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&#xff0c;C生万物&#xff01; 开始我们的C语言之旅吧&#xff01;✈ 目录 前言&#xff1a; 一.分析Bubble_sort 二.解决措施 三.模拟实现 前言&#xff…

【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解

一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表&#xff0c;有一个数据域和两个指针域。一个是前驱指针&#xff0c;指向其前一个节点&#xff1b;一个是后继指针&#xff0c;指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…

java判断字符串是否和空字符串(““)相等、是否和空引用(null)相等,比较顺序不同导致出现死代码(Dead code)

我在用Java实现需求的时候&#xff0c;用到了字符串跟空字符串&#xff08;“”&#xff09;比较&#xff0c;跟空引用null比较&#xff0c;两个比较语句的顺序不同&#xff0c;一个顺序出现了死代码&#xff08;Dead code&#xff09;。 下面这个代码片段&#xff0c;字符串li…

探秘二叉树后序遍历:从叶子到根的深度之旅

本篇博客会讲解力扣“145. 二叉树的后序遍历”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff1a; 先创建一个数组&#xff0c;用来存储二叉树后序遍历的结果。数组的大小跟树的结点个数有关。树的结点个数可以使用递归实现&#xff0c;即总个数左子树结点个数右…

如何将单体项目拆分成微服务

1、如何将单体项目拆分成微服务 如何拆分微服务&#xff1f;其实对不同的业务项目场景&#xff0c;对应有不同的拆分方案。需要项目人员详细的分析项目需求、团队现状、业务边界、业务逻辑等方方面面&#xff0c;拆分的粒度既不能过细&#xff0c;也不能过粗&#xff0c;需要把…

图像 检测 - FCOS: Fully Convolutional One-Stage Object Detection (ICCV 2019)

FCOS: Fully Convolutional One-Stage Object Detection - 全卷积一阶段目标检测&#xff08;ICCV 2019&#xff09; 摘要1. 引言2. 相关工作3. 我们的方法3.1 全卷积一阶目标检测器3.2 FCOS的FPN多级预测3.3 FCOS中心度 4. 实验4.1 消融研究4.1.1 FPN多级预测4.1.2 有无中心度…

Gis入门,根据起止点和一个控制点计算二阶贝塞尔曲线(共三个控制点组成的线段转曲线)

前言 本章讲解如何在gis地图中使用起止点和一个控制点(总共三个控制点)生成二阶贝塞尔曲线。 三阶贝塞尔曲线请参考下一章《Gis入门,使用起止点和两个控制点生成三阶贝塞尔曲线(共四个控制点)》 贝塞尔曲线(Bezier curve)介绍 贝塞尔曲线(Bezier curve)是一种数学…

Nim游戏博弈论

【模板】nim 游戏 题目描述 https://www.luogu.com.cn/problem/P2197 甲&#xff0c;乙两个人玩 nim 取石子游戏。 nim 游戏的规则是这样的&#xff1a;地上有 n n n 堆石子&#xff08;每堆石子数量小于 1 0 4 10^4 104&#xff09;&#xff0c;每人每次可从任意一堆石子…

GDAL C++ API 学习之路 OGRGeometry 线类 OGRLineString

OGRLineString class "ogr_geometry.h" OGRLineString 类是 OGR 库中的一个几何对象类&#xff0c;用于表示线段或折线。它由多个坐标点组成&#xff0c;并且在坐标点之间形成线段。OGRLineString 可以包含 2D、3D 或 3DM 坐标点&#xff0c;其中 M 表示额外…

前端-mac初始化配置

新电脑设置&#xff1a; Mac三指拖动&#xff1a;https://support.apple.com/zh-cn/HT204609 选取苹果菜单  >“系统设置”&#xff08;或“系统偏好设置”&#xff09;。点按“辅助功能”。点按“指针控制”&#xff08;或“鼠标与触控板”&#xff09;。点按“触控板选…

ISO 7637-2 5a/5b抛负载测试保护用TVS二极管,如何选型号?

在国际标准ISO 16750-2颁布之前&#xff0c;全球各大汽车零部件制造商一直采用的是ISO 7637-2标准。ISO 16750-2国际标准发行之后&#xff0c;汽车抛负载浪涌测试中ISO 7637-2 5A和5B测试标准被ISO 16750-2测试标准取代。查看ISO 16750-2和ISO 7637-2国际标准文档资料对比会发现…

13个ChatGPT类实用AI工具汇总

在ChatGPT爆火后&#xff0c;各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具&#xff0c;可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件&#xff0c;可搭配现有的搜索引擎来使用 最大化搜索效率&#xff0c;对搜索体验的提升相…

多线程(JavaEE初阶系列6)

目录 前言&#xff1a; 1.什么是线程池 2.标准库中的线程池 3.实现线程池 结束语&#xff1a; 前言&#xff1a; 在上一节中小编带着大家了解了一下Java标准库中的定时器的使用方式并给大家实现了一下&#xff0c;那么这节中小编将分享一下多线程中的线程池。给大家讲解一…