- 01.快速了解AMS机制
- 1.1 AMS是什么
- 1.2 应用于那些场景
- 1.3 可以解决那些问题
- 02.AMS总体介绍
- 03.AMS流程分析
- AMS-ActivityManagerService是Android系统中极其重要的系统服务。
- AMS贯穿了Android系统组件的核心服务,主要负责Android系统中四大组件的启动、切换、调度以及应用进程管理和调度工作。
- 常见的场景
- 统一调度所有应用程序的Activity的生命周期
- 启动或杀死应用程序的进程
- 启动并调度Service的生命周期
- 注册BroadcastReceiver,并接收和分发Broadcast
- 启动并发布ContentProvider
- 调度task
- 处理应用程序的Crash
- 查询系统当前运行状态
- 深刻了解Android启动流程与AMS特性之后,项目开发中的很多问题都会迎刃而解,比如:
- 热修复、组件化路由、插件化、leakCanary内存问题分析、Hilt注入、Glide原理、launchModel、权限验证、四大组件等相关逻辑和代码……深刻了解之后能帮助Android开发者更加灵活地进行项目开发。
- 业务开发遇到的问题
- 比如我们在开发中遇到的跳转问题、栈的管理问题、ANR问题等等都是与AMS对四大组件的管理息息相关,只有掌握了AMS,才能更加高效的开发出优质的app。
- AMS 即 ActivityManagerService
- 负责 Activity、Service、Broadcast、ContentProvider 四大组件的生命周期管理。
- image
- AMS 创建流程简述:
- SystemServer:依次调用 main()、run()、startBootstrapServices(),再调用 Lifecycle 的 startService() 方法;
- Lifecycle:startService() 方法中调用 SystemServiceManager 的 startService() 方法,并将 Lifecycle.class 传入;
- SystemServiceManager:startService() 方法通过反射调用 Lifecycle 的构造方法,生成 Lifecycle 对象;
- Lifecycle:构造方法中调用 AMS 的构造方法创建 AMS 对象,并通过 getService() 方法返回 AMS 对象。
- AMS启动流程如下所示
- SystemServer#main(),这个是AMS启动的入口。执行java代码中的main方法,创建了一个SystemServer对象并且执行run方法
- SystemServer#run(),创建系统的 Context,创建 SystemServiceManager,启动引导服务,启动核心服务,启动其他服务。
- SystemServer#startBootstrapServices(),启动 AMS,启动 PMS等核心逻辑
- ActivityManagerService.Lifecycle#startService(),这个是开启AMS服务
- SystemServiceManager#startService(),通过反射调用 serviceClass 的构造方法 创建 Lifecycle 对象
- SystemServiceManager#startService()#service.onStart(),调用 Lifecycle 的 onStart 方法。
- ActivityManagerService.Lifecycle#onStart(),进一步调用 AMS 的 start() 方法初始化。
- AMS初始化流程图如下
- image
- AMS初始化流程步骤
- ActivityManagerService#(),在构造函数中创建用于启动 Service 的 mServices 对象,创建用于存储 ContentProvider 的 mProviderMap等。
- ActivityManagerService.Lifecycle#onStart(),进一步调用 AMS 的 start() 方法初始化。
- SystemServer#startBootstrapServices(),调用了 AMS 的 initPowerManagement() 和 setSystemProcess() 方法。
- SystemServer#startCoreServices(),调用了 AMS 的 setUsageStatsManager() 方法。
- SystemServer#startOtherServices(),调用了 AMS 的 installSystemProviders()、setWindowManager() 和 systemReady() 方法。