一句话说透Android里面的查找服务

一句话总结
ServiceManager 就像学校的"教务处",所有老师(系统服务)在这里登记,学生(应用)找老师时先去教务处查教室号(Binder 引用),然后直接去教室找人!


一、ServiceManager 的核心角色

  1. 服务注册中心 :所有系统服务(如 ActivityManagerWindowManager)启动时在此登记。
  2. 服务黄页:提供按名称查询服务的功能,返回服务的联系方式(Binder 引用)。

二、查找服务的流程(以学生找老师为例)

1. 教务处登记老师信息(服务注册)

  • 系统服务启动时 :如 ActivityManagerService(AMS)启动后,向 ServiceManager 注册:

    arduino 复制代码
    ServiceManager.addService("activity", amsBinder);  
  • ServiceManager 维护的映射表

    服务名 Binder 引用
    activity amsBinder
    window wmsBinder
    power powerBinder

2. 学生查教务处(应用查询服务)

  • 应用调用 getSystemService()

    scss 复制代码
    // 示例:获取 ActivityManager  
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  • 底层流程

    1. 联系 ServiceManager :通过固定 Binder 句柄(如 0)访问 ServiceManager。
    2. 按名称查询 :调用 ServiceManager.getService("activity")
    3. 返回 Binder 引用 :拿到 amsBinder,通过它调用 AMS 的方法(如启动 Activity)。

三、关键细节

1. ServiceManager 的 Binder 句柄

  • 固定句柄 0 :所有进程都知道 ServiceManager 的 Binder 句柄是 0,无需动态查找。
  • 直接访问 :通过 BinderInternal.getContextObject() 获取 ServiceManager 的 Binder 代理。

2. 权限校验

  • 敏感服务限制 :如 location(定位服务),普通应用无权限时返回 null
  • 系统级校验 :ServiceManager 会检查调用进程的权限(如 Manifest.permission.ACCESS_FINE_LOCATION)。

3. 缓存优化

  • 客户端缓存 :应用首次获取服务后,可能缓存 Binder 引用(如 ActivityManager 单例),避免重复查询。
  • 服务端缓存:ServiceManager 内部使用高效数据结构(如哈希表)快速查询。

四、查找流程示意图

scss 复制代码
应用 → getSystemService("activity")  
       ↓  
Binder 调用 ServiceManager(句柄0)  
       ↓  
ServiceManager 查表 → 返回 amsBinder  
       ↓  
应用通过 amsBinder 调用 AMS 的方法  

五、为什么需要 ServiceManager?

  1. 统一入口:避免每个服务单独管理通信渠道。
  2. 权限管控:集中校验服务访问权限。
  3. 跨进程协调:解决服务依赖的"鸡生蛋"问题(如 AMS 启动时需要其他服务)。

六、实际场景:启动 Activity

scss 复制代码
// 应用代码  
startActivity(new Intent(this, MainActivity.class));  

// 底层调用链  
1. ContextImpl.getSystemService("activity") → 向 ServiceManager 查 AMS  
2. 拿到 amsBinder → 调用 AMS 的 startActivity()  
3. AMS 处理逻辑 → 通知 ActivityThread 创建新 Activity  

七、总结口诀

  • 服务启动先登记,ServiceManager 管全局
  • 应用查服务按名字,Binder 引用直接取
  • 权限不够不给找,缓存优化效率高
  • 跨进程通信全靠它,安卓流畅不卡壳!
相关推荐
flying robot1 小时前
小结:Android系统架构
android·系统架构
xiaogai_gai1 小时前
有效的聚水潭数据集成到MySQL案例
android·数据库·mysql
鹅鹅鹅呢2 小时前
mysql 登录报错:ERROR 1045(28000):Access denied for user ‘root‘@‘localhost‘ (using password Yes)
android·数据库·mysql
在人间负债^2 小时前
假装自己是个小白 ---- 重新认识MySQL
android·数据库·mysql
Unity官方开发者社区2 小时前
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
android·3d·团结引擎1.5·团结引擎车机版
进击的CJR5 小时前
MySQL 8.0 OCP 英文题库解析(三)
android·mysql·开闭原则
Mckay889 小时前
android studio导入项目
android·ide·android studio
是店小二呀11 小时前
【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
android·c++·算法
奔跑吧 android12 小时前
【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】
android·bluetooth·bt·gd·a2dpsink·免切源·aosp14
飞猿_SIR13 小时前
Android Exoplayer多路不同时长音视频混合播放
android·音视频