Android:Service 启动

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 可通信。

相关推荐
传奇开心果编程13 分钟前
【Jetpack Compose娓娓道来】 第25课:ViewModel就是UI界面的大脑
android·kotlin·移动开发·jetpack compose·编程语言理论·编程框架·声明式ui
马立杰21 分钟前
PHP 未授权 RCE 应急响应:CVE-2026-109618 CVE-2026-109619 排查与加固实战
android·开发语言·php
NamoAmitabha12830 分钟前
安装“编译器环境”(Android Studio)--deepseek--Cocos --Creator3.8.8
android·ide·android studio
聚美智数1 小时前
文档转换 API‑文档转 PDF‑PDF 转文档‑异步文档处理‑文件格式迁移‑转换结果回调推送 API 接口介绍
android·java·pdf
booboosui2 小时前
Android 上的无人回合:只放开 2 类工具,宁可空手
android
事圆则缓4 小时前
Android 性能排查实战:怎么看内存抖动、CPU 占用和 FPS
android
mmsx4 小时前
Android 三类「看着无关」的故障:大事务、UI 阻塞与 ViewModel 作用域
android·ui
换元不配限4 小时前
Android 休眠与唤醒完全指南:从手机到 IoT 设备的实战解析
android·物联网·智能手机·alarmmanager·wakelock·workmanager·休眠和唤醒
通信侠5 小时前
android 16触摸提示音Back虚拟按键无声
android
GY-936 小时前
【Android 】App工程结构和配置
android