返回

Android 10 Service 启动分析

Android

从用户交互到 Service 成功启动,涉及多层过程,Android 内部是如何实现的呢?本文将基于 Android 10 源码,逐步追溯 Service 启动过程,带你一探究竟。

Android Service 启动概述

Service 是 Android 中一种重要的组件,用于执行后台任务。Service 的启动过程可以分为以下几个步骤:

  1. Client 调用 bindService() 方法。
  2. 系统创建并启动 Service。
  3. Service 创建 Binder 对象并将其注册到系统。
  4. Client 通过 Intent 获取 Service 的 Binder 对象。
  5. Client 调用 Binder 对象上的方法来与 Service 通信。

Service 启动详细流程

1. Client 调用 bindService() 方法

Service 的启动从 client 调用 bindService() 方法开始。bindService() 方法的原型如下:

public boolean bindService(Intent service, ServiceConnection conn, int flags);
  • service:要绑定的 Service 的 Intent。
  • conn:一个 ServiceConnection 对象,用于接收 Service 的 Binder 对象。
  • flags:绑定标志,可以是 BIND_AUTO_CREATE、BIND_DEBUG_UNBIND 或 BIND_NOT_FOREGROUND。

当 client 调用 bindService() 方法时,系统会创建一个 Intent 并将其传递给 ActivityManagerService。ActivityManagerService 负责管理所有 Service,它会根据 Intent 找到相应的 Service 并启动它。

2. 系统创建并启动 Service

当 ActivityManagerService 找到要启动的 Service 后,它会创建一个新的进程并加载 Service 的类。然后,系统会调用 Service 的 onCreate() 方法,Service 的 onCreate() 方法负责初始化 Service。

3. Service 创建 Binder 对象并将其注册到系统

在 Service 的 onCreate() 方法中,Service 会创建一个 Binder 对象并将其注册到系统。Binder 对象是用于进程间通信(IPC)的桥梁,它允许 client 与 Service 通信。

4. Client 通过 Intent 获取 Service 的 Binder 对象

当 client 调用 bindService() 方法后,系统会创建一个 ServiceConnection 对象并将其传递给 ActivityManagerService。ServiceConnection 对象负责接收 Service 的 Binder 对象。

当 Service 启动并注册 Binder 对象后,系统会调用 ServiceConnection 对象的 onServiceConnected() 方法。在 onServiceConnected() 方法中,client 可以通过 Intent 获取 Service 的 Binder 对象。

5. Client 调用 Binder 对象上的方法来与 Service 通信

client 获取 Service 的 Binder 对象后,就可以调用 Binder 对象上的方法来与 Service 通信。Binder 对象上的方法都是抽象方法,需要由 Service 来实现。

当 client 调用 Binder 对象上的方法时,系统会将方法调用转换为一个 IPC 请求,并将其发送给 Service。Service 会处理 IPC 请求,并返回结果给 client。

结论

Android Service 的启动过程涉及多层过程,本文从 client 调用 bindService() 方法开始,到 service 成功绑定为止,逐步追溯了中间的关键流程。通过本文,读者可以对 Android Service 的启动过程有一个更深入的了解。