知识点梳理 - AMS 的介绍及知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qizewei123/article/details/88290110

这篇文章将用最简单的语言告诉你 AMS(ActivityManagerService)是什么及相关的知识点,帮我们更系统的理解Android系统的工作原理。

1. AMS简介

AMS是什么?

ActivityManagerService是一个服务(我们后面都坚称AMS),用来管理Activity,而且它是一个系统服务,就像包管理服务(PMS),电池管理,震动管理服务一样。

AMS是系统服务,所以运行在systemProcess(系统进程)中,但AMS是一个单独的线程,这个线程来处理AMS对Activity的管理,因为系统服务不可能运行在systemProcess进程的主线程中。

2. AMS主要功能

  1. 统一调度各应用程序的Activity。 Activity启动都要报告给AMS,AMS决定是否可以启动。Activity的启动过程序属于Activity内部操作,但AMS必须知道程序都运行了那些Activity。
  2. 内存管理。Android官方称,Activity退出后,所在进程不会被立刻杀死,下次启动时该Activity时能提高启动速度。只有当内存紧张时,才会被自动杀死。应用程序不用关注这个问题,正是AMS实现的。
  3. 进程管理。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方法主要做了两件事:

  1. 先创建AMS/PMS对象;
  2. 将AMS/PMS添加到ServiceManager的ArrayList(系统服务列表)完成注册

4. AMS内的数据结构

  1. ActivityRecord:它内部记录了一个Activity的所有信息,所以用来描述一个Activity。它主要记录的数据包括:AMS的引用,Activity状态,AndroidManifes节点信息,所在的TaskRecord(关联TaskRecord)。

  2. TaskRecord:它用来描述一个Activity的任务栈,内部存储了任务栈的所有信息。

  3. ActivityStack:ActivityStack是一个管理类,用来管理系统所有的Activity,其内部维护了Activity的所有状态,特殊状态的Activity,Activity相关的列表数据。

    ActivityStack 相关知识点:

    • ActivityStack中通过枚举存储了Activity的所有状态。
    • 在ActivityStack中定义了一些特殊状态Activity,比如:PausingActivity,LastPauseActivity等等。
    • 维护的ArrayList:ActivityStack中维护了很多ArrayList,主要有ActivityRecord,TaskRecord。
    • ActivityStack的实例类型:
      1. mHomeStack存储LauncherApp的所有Activity;
      2. mFocusdStack存储正在接收输入或启动下一个Activity的所有Activity;
      3. mLastFocusedStack表示此前接收输入的所有Activity。
        通过 ActivityStackSupervisor 能获取以上ActivityStack。

5. AMS的栈管理

ActivityStack -> TaskRecord -> ActivityRecord

就是说:ActivityStack 管理 TaskRecord ,TaskRecord 管理 ActivityRecord。

为了方便进行栈管理,Android提供了很多配置,包括LaunchMode(Activity四个启动模式还记得么),Intent的FLAGtaskAffinity 等( 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

猜你喜欢

转载自blog.csdn.net/qizewei123/article/details/88290110