startService
流程四步
1. 应用层发起启动请求
- 调用
startService(Intent)→ 最终通过 Binder 调用 AMS 的startService方法。
2. AMS 处理 Intent 与 Service 生命周期
- AMS 解析 Intent 找到目标
Service(通过PackageManager的resolveService)。 - 检查
Service是否已创建(ServiceRecord,包含了包名、类名、Intent信息):- 如果没有创建 → 先创建
ServiceRecord。 - 如果已创建 ,表明
Service已经启动 → 直接走onStartCommand。
- 如果没有创建 → 先创建
3. 进程存在性检查与进程创建(若需要)
- AMS 检查
Service所属进程是否已存在:- 进程已存在 → 直接通知该进程创建
Service对象。 - 进程不存在 → AMS 通过 Socket 向
Zygote请求 fork 新进程(流程同应用进程启动)。新进程启动后,自动向 AMS 注册,AMS 再继续下发创建Service的命令。
- 进程已存在 → 直接通知该进程创建
4. 目标进程创建 Service 并调用生命周期
- AMS 通过 Binder 通知目标进程的 ApplicationThread,通过 Handler 发送
CREATE_SERVICE消息给 ActivityThread(主线程),切换到主线程创建Service:- 实例化
Service(反射调用无参构造)。 - 调用
attach()绑定 Context 与Application。 - 依次执行
onCreate()→onStartCommand(Intent, flags, startId)。
- 实例化
关键点 :
onStartCommand可能被多次调用,onCreate只执行一次。
BindService
Android bindService 流程(面试版)
核心特点
bindService建立客户端-服务端 Binder 连接 ,生命周期通常跟随绑定者(Activity 等)。- 服务端通过
onBind()返回IBinder,客户端通过ServiceConnection接收。
流程五步走
1. 客户端发起绑定
- 调用
bindService(intent, connection, flags)→ Binder 调用 AMS 的bindService方法。
2. AMS 解析 Service 并检查进程
- AMS 通过
PackageManager解析 Intent 得到目标Service的ComponentName。 - 检查
ServiceRecord是否已存在:- 不存在 → 创建新的
ServiceRecord。 - 已存在 → 复用。
- 不存在 → 创建新的
- 检查目标进程是否存在:
- 不存在 → 通过 Socket 向 Zygote 请求 fork 新进程(同普通应用进程启动)。新进程启动后自动向 AMS 注册,然后 AMS 继续执行绑定流程。
3. AMS 调用 Service 的 onBind(进程内)
- AMS通过BInder通知目标进程ApplicationThread通过Handler发送
BIND_SERVICE消息给ActivityThread切换到主线程 ActivityThread通过反射创建Service实例,调用onCreate()。- 调用
onBind(intent),得到服务端返回的IBinder对象。
4. IBinder 传递回 AMS 并分发给客户端
- 服务端将
IBinder通过 Binder 回传给 AMS。 - AMS 将该
IBinder转发给客户端的ServiceConnection(通过 Binder 回调)。 - 客户端收到回调后,
onServiceConnected被调用,客户端拿到IBinder,可以跨进程调用服务方法。
5. 生命周期与解绑
- 绑定后,服务会持续运行(除非进程被杀)。
- 调用
unbindService时,如果没有其他绑定且未通过 startService 启动 ,系统会销毁 Service(调用onDestroy)。
与 startService 的关键区别
| 维度 | startService | bindService |
|---|---|---|
| 生命周期 | 独立于调用者,可无限运行 | 通常跟随绑定者(Activity 销毁则自动 unbind) |
| 核心方法 | onStartCommand |
onBind + ServiceConnection |
| 通信方式 | 单向启动,无返回数据 | 通过 IBinder 双向通信 |
| 销毁条件 | 主动 stopService 或 stopSelf |
所有绑定者都 unbind + 未启动 |
| 混合使用 | 可同时 start + bind,此时需都解除才能销毁 |
面试官可能的追问
-
bindService 的 flags 有什么用?
BIND_AUTO_CREATE(常用):服务未创建时自动创建;其他如BIND_DEBUG_UNBIND、BIND_NOT_FOREGROUND等。 -
多次 bindService 会重复创建 Service 吗?
不会。
onCreate和onBind只执行一次,ServiceConnection各自独立,系统记录绑定计数。 -
bindService 能否启动一个在其他进程的服务?
可以,这是跨进程通信的核心场景。系统会自动处理进程创建和 Binder 传递。
-
如果服务进程被杀,绑定会怎样?
客户端的
onServiceDisconnected会被回调(如果 flags 包含BIND_AUTO_CREATE,系统可能尝试重建,但通常需自己处理重连)。
一句话记忆口诀
客户端调 bind 到 AMS,AMS 找服务按需起进程,服务 onBind 返 Binder,AMS 转交给连接,双方通过 Binder 可通信。