Service、广播与 Provider 如何与进程协作
Service、广播与 Provider 如何与进程协作
Service、广播和 ContentProvider 的状态机不同,但执行代码都需要宿主进程。AMS 接到请求后 先定位组件与进程;进程不存在时触发创建,进程已经存在时再根据对应队列或连接状态调度组件。 组件活动还会反向影响进程优先级。
三类组件共享同一套进程模型
| 常见误解 | 正确理解 |
|---|---|
| Service、广播、Provider 各有完全独立的系统 | 它们共享 AMS 的进程模型,都需要进程存在才能执行 |
| 广播发出后一定立刻执行 | 广播先进队列,按顺序、优先级和进程状态调度 |
三类组件的执行都依赖宿主进程:进程不存在就先启动进程,进程太忙就排队。AMS 是它们的共同“资源调度中心”。
协作主链
三类组件触发时,先走到 AMS,再由 AMS 决定“进程是否在岗”。这是它们共同的进程视角。
逐步解释:
- ① 应用入口:Service、广播和 Provider 请求都经 Binder 进入 AMS。
- ② 服务端分发:分别交给 ActiveServices、BroadcastQueue 或 ContentProviderHelper。
- ③ 进程判断:宿主进程不存在时,先走进程创建主链。
- ④ 派发执行:进程就绪后,组件代码在应用进程执行。
- ⑤ 反馈优先级:组件运行状态反过来影响进程的 oom_adj。
三类组件共享同一个判断:先保进程,再谈执行。
三类组件的进程视角
| 组件 | 服务端管理器 | 核心动作 | 与进程的关系 |
|---|---|---|---|
| Service | ActiveServices | bringUpServiceLocked() | 进程不存在则先启动进程 |
| 广播 | BroadcastQueue / BroadcastQueueImpl | enqueueBroadcastLocked() → scheduleBroadcastsLocked() | 按队列调度,可能唤醒进程 |
| ContentProvider | ContentProviderHelper | 维护 ProviderRecord | 进程存在时绑定,进程死亡后重建 |
AMS 的字段(AMS.java:2607-2610):mBroadcastQueues、mServices = new ActiveServices(this)、mCpHelper = new ContentProviderHelper(this, true)——三类组件都在 AMS 中托管。
服务:ActiveServices
ActiveServices(ActiveServices.java:262)管理 ServiceRecord 的启动、绑定与停止。bringUpServiceLocked()(5500 行)是服务上屏的核心:检查进程,必要时请求创建进程,再执行 onCreate。
// ActiveServices.java:5500
private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg, ...)广播:BroadcastQueue
广播先被 enqueueBroadcastLocked()(BroadcastQueueImpl.java:239)加入队列,再 scheduleBroadcastsLocked()(285 / 293 行)安排处理,最终由 processNextBroadcast()(181 行)按顺序派发。Android 14 同时存在 legacy 与现代队列实现,上层接口统一在 BroadcastQueue。
Provider:ContentProviderHelper
ContentProviderHelper(ContentProviderHelper.java:108)维护 ContentProviderRecord、进程绑定与授权。Provider 没有独立进程概念,它属于某个应用进程;调用方进程与 Provider 进程通过 Binder 通信。
与进程优先级的联动
Service 在后台运行、正在接收广播、正在被绑定的 Provider,都会影响进程的 oom_adj 档位, 具体计算边界见进程优先级。后台播放能否进入可感知档位,还取决于 前台服务等实际组件状态,不能仅凭“正在播放”推断。
源码入口
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
services/core/java/com/android/server/am/ActivityManagerService.java | 2607 行 mBroadcastQueues;2609 行 mServices;2610 行 mCpHelper | 组件托管字段 |
services/core/java/com/android/server/am/ActiveServices.java | 262 行 class ActiveServices;5500 行 bringUpServiceLocked(...) | Service 管理 |
services/core/java/com/android/server/am/ServiceRecord.java | 80 行 final class ServiceRecord | 服务记录 |
services/core/java/com/android/server/am/BroadcastQueue.java | 44 行 public abstract class BroadcastQueue | 队列抽象 |
services/core/java/com/android/server/am/BroadcastQueueImpl.java | 239 行 enqueueBroadcastLocked(...);285 / 293 行 scheduleBroadcastsLocked();181 行 processNextBroadcast(...) | 广播调度 |
services/core/java/com/android/server/am/ContentProviderHelper.java | 108 行 class ContentProviderHelper | Provider 管理 |