AMS和Activity启动过程

AMS

AMS的功能

  1. ==统一调试应用程序的Activity==:应用程序要运行Activity,首先会报告给AmS,然后由AmS决定该Activity是否启动。AMS必须知道各个应用程序运行的Activity。
  2. ==内存管理==: Activity退出后,其所在的进程并不会被立即杀死,从而在下次启动的时候,提高Activity的启动速度。这些Activity只有在内存吃紧的时候,才会被自动杀死,这些操作由AMS管理。
  3. ==进程管理==: AmS向外提供了查询系统正在运行的进程API。

AMS创建过程

  1. AMS是在SystemServer中启动的,==SystemServer的main方法中调用它的run方法==。
  2. 在run方法中(会创建SystemServiceManager,它会对系统的服务进行创建 、启动、和生命周期管理)==会调startBootstrapService()方法启动引导服务==(ActivityManagerService、PowerManagerService、PackageManagerService等)
  3. 在startBootstrapService()方法中==调用了SystemServiceManager的startService方法,方法参数是AMS的内部类Lifecycle,它的构造函数会new一个AMS的对象。==

AMS家族重要术语解释

  • ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期

  • ==ActivityThread==,App的真正入口。当开启App之后,调用main()开始运行,开启消息循环队列,这就是传说的UI线程或者叫主线程。与ActivityManagerService一起完成Activity的管理工作。

  • ApplicationThread,用来实现ActivityManagerServie与ActivityThread之间的交互。在ActivityManagerSevice需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通信。

  • ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通信。AMS就是通过该代理与ActivityThread进行通信的

  • Instrumentation,每一个应用程序只有一个Instrumetation对象,每个Activity内都有一个对该对象的引用,Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。

  • ActivityStackActivity在AMS的栈管理,用来记录经启动的Activity的先后关系,状态信息等。通过ActivtyStack决定是否需要启动新的进程。

  • ActivityRecordActivityStack的管理对象,每个Acivity在AMS对应一个ActivityRecord,来记录Activity状态以及其他的管理信息。其实就是服务器端的Activity对象的映像

  • TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这概念应该不陌生。

AMS相关类图

image.png

APP启动过程(根Activity启动)

  • 1、点击桌面应用图标,==Launcher进程将启动Activity(MainActivity)的请求以Binder的方式发送给了AMS==。
  • 2、==AMS接收到启动请求后,交付ActivityStarter处理Intent和Flag等信息==,然后再交给ActivityStackSupervisior/ActivityStack 处理Activity进栈相关流程。==同时以Socket方式请求Zygote进程fork新进程==。
  • 3、==Zygote接收到新进程创建请求后fork出新进程==。
  • 4、==在新进程里创建ActivityThread对象==,新创建的ActivityThread就是应用的主线程,==在主线程里开启Looper消息循环,开始处理创建Activity==。
  • 5、==ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法==,这样便完成了Activity的启动。
image.png

==整个流程主要涉及四个进程==:

  • ==调用者进程==,如果是在桌面启动应用就是Launcher应用进程。
  • ActivityManagerService等所在的==System Server进程==,该进程主要运行着系统服务组件。
  • ==Zygote进程==,该进程主要用来fork新进程。
  • ==新启动的应用进程==,该进程就是用来承载应用运行的进程了,它也是应用的主线程(新创建的进程就是主线程),处理组件生命周期、界面绘制等相关事情。

普通Activity启动过程

普通Activity的启动过程只涉及两个进程,AMS所在进程和应用程序进程。

启动Activity B -> 当前有正在显示的activity吗 -> 有就先pause() -> B的进程存在吗 -> 不存在则创建 -> B进程启动指定的Activity


image.png

你可能感兴趣的:(AMS和Activity启动过程)