第四章 四大组件工作过程.md

4.1 根 Activity 的启动过程

根 Activity 指的是应用程序启动的第一个 Activity,这里主要分为三个过程:

Launcher 请求 AMS,AMS 到 ApplicationThread 的调用过程,ActivityThread 启动 Activity 。

4.1.1 Launcher 请求 AMS 过程

image20210930160500429.png

4.1.2 AMS 到 ApplicationThread

该过程代码比较复杂,这里直接给出进程通讯图:

image20210930161436287.png

4.1.3 ActivityThread 启动 Activity 过程

image20210930161953574.png

这里 H 为 handler,主要是使用消息队列机制保证在主线程执行 。

4.1.4 根 Activity 启动涉及的进程通讯

image20210928152025063.png

其中,步骤 2 采用 Socket 通信,步骤 1 和 4 采用 Binder 通信。

4.2 Service 的启动过程

分为两个过程,ContextImpl 到 AMS 的调用过程和 ActivityThread 启动 Service 。

4.2.1 ContextImpl 到 AMS 的调用过程

image20210928152609962.png

4.2.2 ActivityTrhead 启动 Service

image20211001120214693.png

4.3 Service 的绑定过程

分为两个部分,分别是 ContextImpl 到 AMS 的调用过程和 Service 的绑定过程

4.3.1 ContextImpl 到 AMS 的调用过程

image20210928154029094.png

4.3.2 Service 的绑定过程

几个与 Service 相关的对象类型:

  • ServiceRecord:描述一个 Service
  • ProcessRecord:描述一个进程
  • ConnectionRecord:描述进程和 Service 建立的一次通讯
  • AppBindRecord:应用进程通过其来维护 Service 与应用进程之间的关联
  • IntentBindRecord:描述绑定 Service 的 Intent

因为该过程较为复杂,书中分为两半给出时序图

image20211001121228588.png

image20211001122350675.png

4.4 广播的注册、发送和接收过程 (PASS)

4.5 ContentProvider 的启动过程(PASS)

4.6 小结

Android 7.0 的启动过程中除了以上过程,还涉及到 ActivityManagerProxy 和 ApplicationTrheadProxy 等代理类。以上过程为 Android 8.0 的过程,主要使用 AIDL 技术去掉了一些代理类(或者说自动生成)