这篇文章将用最简单的语言告诉你 AMS(ActivityManagerService)是什么及相关的知识点,帮我们更系统的理解Android系统的工作原理。
1. AMS简介
AMS是什么?
ActivityManagerService是一个服务(我们后面都坚称AMS),用来管理Activity,而且它是一个系统服务,就像包管理服务(PMS),电池管理,震动管理服务一样。
AMS是系统服务,所以运行在systemProcess(系统进程)中,但AMS是一个单独的线程,这个线程来处理AMS对Activity的管理,因为系统服务不可能运行在systemProcess进程的主线程中。
2. AMS主要功能
- 统一调度各应用程序的Activity。 Activity启动都要报告给AMS,AMS决定是否可以启动。Activity的启动过程序属于Activity内部操作,但AMS必须知道程序都运行了那些Activity。
- 内存管理。Android官方称,Activity退出后,所在进程不会被立刻杀死,下次启动时该Activity时能提高启动速度。只有当内存紧张时,才会被自动杀死。应用程序不用关注这个问题,正是AMS实现的。
- 进程管理。AMS向外提供了查询系统正在运行的进程信息的API。
3. AMS/PMS的启动过程
在 SystemServer.java 的Main方法中有一句:
new SystemServer().run()
所以,AMS的启动是在SystemServer进程中启动的。
系统根据重要程度将 SystemServer 分为三种并依次启动:
- 引导服务(startBootstrapServices):AMS,PMS,PowerManagerService
- 核心服务(startCoreService):BatteryService,WebViewUpdateService
- 其他服务(startOtherService):CameraService,WMS,AlarmManagerService
SystemServer的main方法主要做了两件事:
- 先创建AMS/PMS对象;
- 将AMS/PMS添加到ServiceManager的ArrayList(系统服务列表)完成注册。
4. AMS内的数据结构
-
ActivityRecord:它内部记录了一个Activity的所有信息,所以用来描述一个Activity。它主要记录的数据包括:AMS的引用,Activity状态,AndroidManifes节点信息,所在的TaskRecord(关联TaskRecord)。
-
TaskRecord:它用来描述一个Activity的任务栈,内部存储了任务栈的所有信息。
-
ActivityStack:ActivityStack是一个管理类,用来管理系统所有的Activity,其内部维护了Activity的所有状态,特殊状态的Activity,Activity相关的列表数据。
ActivityStack 相关知识点:
- ActivityStack中通过枚举存储了Activity的所有状态。
- 在ActivityStack中定义了一些特殊状态Activity,比如:PausingActivity,LastPauseActivity等等。
- 维护的ArrayList:ActivityStack中维护了很多ArrayList,主要有ActivityRecord,TaskRecord。
- ActivityStack的实例类型:
- mHomeStack存储LauncherApp的所有Activity;
- mFocusdStack存储正在接收输入或启动下一个Activity的所有Activity;
- mLastFocusedStack表示此前接收输入的所有Activity。
通过 ActivityStackSupervisor 能获取以上ActivityStack。
5. AMS的栈管理
ActivityStack -> TaskRecord -> ActivityRecord
就是说:ActivityStack 管理 TaskRecord ,TaskRecord 管理 ActivityRecord。
为了方便进行栈管理,Android提供了很多配置,包括LaunchMode(Activity四个启动模式还记得么),Intent的FLAG 和 taskAffinity 等( LaunchMode和FLAG设置启动方式有冲突时,以Intent的FLAG为准)。
taskAffinity介绍:
在Manifest.xml中设置android:taskAffinity来指定Activity希望归属的栈,默认情况下同一个程序Activity有相同的taskAffinity。taskAffinity在下面两种情况会生效:
1. taskAffinity与Intetnt 的 FLAG_ACTIVOTY_NEW_TASK或者singleTask配合,实现独立的栈。
2. taskAffinity 与 allowTaskReparenting 配合。如果 allowTaskReparenting 设置为true,说明Activity具有转移任务栈的能力。
我是雷加,如果您喜欢我的文章,请留下你的赞;如有疑问和建议,请在评论区留言
欢迎Follow,Star 我的GitHub,感谢 ~~~
GitHub : [https://github.com/QzwJuHao](https://github.com/QzwJuHao)
--------------------------------------- The End