AMS 是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要 AMS 的支持。
AMS 的启动流程
AMS启动流程.pngAMS 与进程启动
Zygote 的 Java 框架层中,会创建一个 Server 端的 Socket,这个 Socket 用来等待 AMS 来请求 Zygote 来创建新的应用程序进程。
AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求 Zygote 进程将需要的应用程序进程启动。
以Service的启动为例,Service 的启动过程中会调用 ActiveServices 的 bringUpServiceLocked 方法。
应用程序进程启动之Srevice启动.pngAMS 家族
ActivityManager 是一个和 AMS 相关联的类,它主要对运行中的 Activity 进行管理.
这些管理工作并不是由 ActivityManager 来处理的,而是交由 AMS 来处理,ActivityManager 中的方法会通过 ActivityManagerNative(以后简称 AMN)的 getDefault 方法来得到 ActivityManagerProxy(以后简称 AMP),通过 AMP 就可以和 AMN 进行通信。
AMN 是一个抽象类,它会将功能交由它的子类 AMS 来处理,因此,AMP 就是 AMS 的代理类。AMS 作为系统核心服务,很多 API 是不会暴露给 ActivityManager 的,因此 ActivityManager 并不算是 AMS 家族一份子。
AMS家族以Activity 的启动过程为例
AMP 和 AMN 是运行在两个进程的,AMP 是 Client 端,AMN 则是 Server 端,而 Server 端中具体的功能都是由 AMN 的子类 AMS 来实现的,因此,AMP 就是 AMS 在 Client 端的代理类。AMN 又实现了 Binder 类,这样 AMP 可以和 AMS 就可以通过 Binder 来进行进程间通信。
应用程序启动之Activity启动.pngActivityManager 通过 AMN 的 getDefault 方法得到 AMP,通过 AMP 就可以和 AMN 进行通信,也就是间接的与 AMS 进行通信。除了 ActivityManager,其他想要与 AMS 进行通信的类都需要通过 AMP。
网友评论