<commit_before># Android组件框架：Android组件管理者ActivityManager

**关于作者**

>郭孝星，程序员，吉他手，主要从事Android平台基础架构方面的工作，欢迎交流技术方面的问题，可以去我的[Github](https://github.com/guoxiaoxing)提issue或者发邮件至<EMAIL>与我交流。

第一次阅览本系列文章，请参见[导读](https://github.com/guoxiaoxing/android-open-source-project-analysis/blob/master/doc/导读.md)，更多文章请参见[文章目录](https://github.com/guoxiaoxing/android-open-source-project-analysis/blob/master/README.md)。

**文章目录**

- 一 组件管家ActivityManagerService
    - 1.1 ActivityManagerService启动流程
    - 1.1 ActivityManagerService工作流程
- 二 应用主线程ActivityThread
    - 2.1 ActivityThread启动流程
    - 2.2 ActivityThread工作

ActivityManagerService是贯穿Android系统组件的核心服务，在ServiceServer执行run()方法的时候被创建，运行在独立的线程中，负责Activity、Service、BroadcastReceiver的启动、切换、调度以及应用进程的管理和调度工作。

Activity、Service、BroadcastReceiver的启动、切换、调度都有着相似的流程，我们来看一下。

Activity的启动流程图（放大可查看）如下所示：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/activity_start_flow.png" />

主要角色有：

- Instrumentation: 监控应用与系统相关的交互行为。
- AMS：组件管理调度中心，什么都不干，但是什么都管。
- ActivityStarter：处理Activity什么时候启动，怎么样启动相关问题，也就是处理Intent与Flag相关问题，平时提到的启动模式都可以在这里找到实现。
- ActivityStackSupervisior：这个类的作用你从它的名字就可以看出来，它用来管理Stack和Task。
- ActivityStack：用来管理栈里的Activity。
- ActivityThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。

Service的启动流程图（放大可查看）如下所示：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/service_start_flow.png" />

主要角色有：

- AMS：组件管理调度中心，什么都不干，但是什么都管。
- ApplicationThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
- ActiveServices：主要用来管理Service，内部维护了三份列表：将启动Service列表、重启Service列表以及以销毁Service列表。

BroadcastReceiver的启动流程图（放大可查看）如下所示：

主要角色有：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/broadcast_start_flow.png" />

- AMS：组件管理调度中心，什么都不干，但是什么都管。
- BroadcastQueue：广播队列，根据广播的优先级来管理广播。
- ApplicationThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
- ReceiverDispatcher：广播调度中心，采用反射的方式获取BroadcastReceiver的实例，然后调用它的onReceive()方法。

可以发现，除了一些辅助类外，最主要的组件管家AMS和应用主线程ActivityThread。本篇文章重点分析这两个类的实现，至于其他类会在
Activity、Service与BroadcastReceiver启动流程的文章中一一分析。

通过上面的分析，AMS的整个调度流程就非常明朗了。

>ActivityManager相当于前台接待，她将客户的各种需求传达给大总管ActivityMangerService，但是大总管自己不干活，他招来了很多小弟，他最信赖的小弟ApplicationThread
替他完成真正的启动、切换、以及退出操作，至于其他的中间环节就交给ActivityStack、ActivityStarter等其他小弟来完成。

## 一 组件管家ActivityManagerService

### 1.1 ActivityManagerService启动流程

我们知道所有的系统服务都是在[SystemServer](https://android.googlesource.com/platform/frameworks/base/+/7d276c3/services/java/com/android/server/SystemServer.java)的run()方法里启动的，SystemServer
将系统服务分为了三类：

- 引导服务
- 核心服务
- 其他服务

ActivityManagerService属于引导服务，在startBootstrapServices()方法里被创建，如下所示：

```java
mActivityManagerService = mSystemServiceManager.startService(<commit_msg>document: ActivityManager<commit_after># Android组件框架：Android组件管理者ActivityManager

**关于作者**

>郭孝星，程序员，吉他手，主要从事Android平台基础架构方面的工作，欢迎交流技术方面的问题，可以去我的[Github](https://github.com/guoxiaoxing)提issue或者发邮件至<EMAIL>与我交流。

第一次阅览本系列文章，请参见[导读](https://github.com/guoxiaoxing/android-open-source-project-analysis/blob/master/doc/导读.md)，更多文章请参见[文章目录](https://github.com/guoxiaoxing/android-open-source-project-analysis/blob/master/README.md)。

**文章目录**

- 一 组件管家ActivityManagerService
    - 1.1 ActivityManagerService启动流程
    - 1.1 ActivityManagerService工作流程
- 二 应用主线程ActivityThread
    - 2.1 ActivityThread启动流程
    - 2.2 ActivityThread工作

ActivityManagerService是贯穿Android系统组件的核心服务，在ServiceServer执行run()方法的时候被创建，运行在独立的线程中，负责Activity、Service、BroadcastReceiver的启动、切换、调度以及应用进程的管理和调度工作。

Activity、Service、BroadcastReceiver的启动、切换、调度都有着相似的流程，我们来看一下。

Activity的启动流程图（放大可查看）如下所示：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/activity_start_flow.png" />

主要角色有：

- Instrumentation: 监控应用与系统相关的交互行为。
- AMS：组件管理调度中心，什么都不干，但是什么都管。
- ActivityStarter：处理Activity什么时候启动，怎么样启动相关问题，也就是处理Intent与Flag相关问题，平时提到的启动模式都可以在这里找到实现。
- ActivityStackSupervisior：这个类的作用你从它的名字就可以看出来，它用来管理Stack和Task。
- ActivityStack：用来管理栈里的Activity。
- ActivityThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。

Service的启动流程图（放大可查看）如下所示：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/service_start_flow.png" />

主要角色有：

- AMS：组件管理调度中心，什么都不干，但是什么都管。
- ApplicationThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
- ActiveServices：主要用来管理Service，内部维护了三份列表：将启动Service列表、重启Service列表以及以销毁Service列表。

BroadcastReceiver的启动流程图（放大可查看）如下所示：

<img src="https://github.com/guoxiaoxing/android-open-source-project-analysis/raw/master/art/app/component/broadcast_start_flow.png" />

主要角色有：

- AMS：组件管理调度中心，什么都不干，但是什么都管。
- BroadcastQueue：广播队列，根据广播的优先级来管理广播。
- ApplicationThread：最终干活的人，是ActivityThread的内部类，Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
- ReceiverDispatcher：广播调度中心，采用反射的方式获取BroadcastReceiver的实例，然后调用它的onReceive()方法。

可以发现，除了一些辅助类外，最主要的组件管家AMS和应用主线程ActivityThread。本篇文章重点分析这两个类的实现，至于其他类会在
Activity、Service与BroadcastReceiver启动流程的文章中一一分析。

通过上面的分析，AMS的整个调度流程就非常明朗了。

>ActivityManager相当于前台接待，她将客户的各种需求传达给大总管ActivityMangerService，但是大总管自己不干活，他招来了很多小弟，他最信赖的小弟ActivityThread
替他完成真正的启动、切换、以及退出操作，至于其他的中间环节就交给ActivityStack、ActivityStarter等其他小弟来完成。

## 一 组件管家ActivityManagerService

### 1.1 ActivityManagerService启动流程

我们知道所有的系统服务都是在[SystemServer](https://android.googlesource.com/platform/frameworks/base/+/7d276c3/services/java/com/android/server/SystemServer.java)的run()方法里启动的，SystemServer
将系统服务分为了三类：

- 引导服务
- 核心服务
- 其他服务

ActivityManagerService属于引导服务，在startBootstrapServices()方法里被创建，如下所示：

```java
mActivityManagerService = mSystemServiceManager.startService(
{'fraction_non_alphanumeric': 0.1094261588833362, 'fraction_numerical': 0.005169739789763915, 'mean_word_length': 10.076335877862595, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 15, 'https://': 14, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4633482', 'n_tokens_mistral': 3060, 'n_tokens_neox': 3353, 'n_words': 128}