1.AMS简介
在Android中,一个应用运行时为一个进程,系统对应用的管理是通过一个专门的系统级service——ActivityManagerService,即AMS。
系统通过AMS来管理应用进程的生命周期,也包括应用的activity和service的生命周期。
AMS是一个独立的进程,它与应用进程之间需要通过跨进程交互。
2.AMS与应用的跨进程交互
ActivityManagerProxy是AMS的代理,供应用进程调用,可以通过ActivityManagerNative.getDefault()获取。
ApplicationThreadProxy是应用进程的代理,供AMS进程调用。应用启动时,会将应用进程的代理传递到AMS
举个例子说明下,假如有进程A和进程B,进程B要调用进程A,那么A是server端,B是client端。AP是server端的远程代理,代理AP和server端拥有相同的调用接口。进程B要调用进程A的接口fun,直接调用代理AP的接口fun,代理AP通过Binder机制通知进程A,唤起进程A调用相同的接口fun。
3. 从进程角度看Activity启动流程
3.1 简要流程
图中展示的是重新启动一个APP的流程。
(1) 其他应用通过调用startActivity启动另外一个应用,通过ActivityManagerProxy请求AMS去启动activity。
(2) AMS为新的应用创建进程,并进入ActivityThread的main函数,在main函数中,完成主线程初始化并loop起来。
主线程的初始化主要是实例化ActivityThread和ApplicationThread,创建MainLooper。ActivityThread和ApplicationThread实例用于与AMS进程的通信。
(3) 应用进程在attach函数中通过AMS的代理将实例化的ApplicationThread Binder传递给AMS,AMS可以通过这个binder的代理就可以对应用进程进行访问了。
(4) AMS通过ApplicationThread的代理,请求启动Activity。ApplicationThread通知主线程执行该请求。然后,ActivityThread执行Activity的启动。
Activity的启动包括,Activity的实例化,Application的实例化,以及Activity的启动流程:create、start、resume。
可以看到Activity的实例化其实要先于Application的实例化,但对于onCreate之类的流程,Application要先于Activity。
需要注意,在ApplicationThreaad中,对应AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder线程中,它会向主线程发送消息,ActivityThread的Handler会调用相应的handleXXXActivity方法,然后会执行performXXXActivity方法,最终调用Activity的onXXX方法。
3.2 详细流程
图中描述了启动过程中的函数调用,函数所属的类及进程的关系,流程比较复杂,下面说下几个注意点:
(1) Activity通过ActivityManagerNative::getDefault()获取AMS的远程代理,它返回的是代理ActivityManagerService的ActivityManagerProxy。
(2) AMS通过ActivityStack和ActivityStackSupervisor管理Activity栈,实现Activity之间的切换。
(3) ActivitStack对应Activity生命周期的方法: xxxActivityLocked, 如startActivityLocked。
(4) 全新启动过程中,AMS只进行了Launch调度,没有进行Start和Resume调度。
3.3 scheduleLaunchActivity之后的流程
这部分主要是Activity的启动,包括Activity的实例化及onCreate、onStart、onResume生命周期的执行。
4 从进程角度看Activity退出过程
4.1 简要流程
(1) Activity的退出由调用Activity的finish()函数开始。
(2) 通过ActivityManagerProxy通知AMS调度Activity的Pause。
(3) Activity的pause操作完成后通知AMS。
(4) AMS调度Activity的Destroy。Activity执行这个请求时,会先stop,再执行Destroy。
4.2 详细流程
4.3 schedulePauseActivity和scheduleDestroyActivity