Activity启动(4)----从进程角度看

感情迁移 提交于 2020-02-26 03:24:35

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

                                      

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!