Activity的启动流程
相关源码:
调用 startActivity 或 startActivityForResult 来启动Activity。那么启动的Activity有两种情况:第一种是启动同进程内的Activity; 第二种是启动不同进程的根Activity,比如在桌面点击启动App,就是启动不同进程的Activity。这两种情况的Activity的启动流程大致相同,其流程大致是以下三个过程:
以下逐一讲解这三大过程:
下图是调用进程向system_server进程发起请求的过程:
startActivityForResult方法继续调用 Instrumentation.execStartActivity 方法。而Instrumentation类主要用来监控应用程序和系统的交互。
下图是ATMS处理startActivity过程,并回调启动进程的ApplicationThread
ATMS. startActivity:
ATMS类通过一系列方法调用最终来到 startActivityAsUser 的方法,该方法先检查调用进程的权限,然后通过 getActivityStartController().obtainStarter 创建 ActivityStarter 类,并把参数设置到 ActivityStarter.Request 类中,最后执行 ActivityStarter.execute() 方法。
ActivityStarter准备堆栈
在 ActivityStarter. executeRequest 方法中先做一系列的检查,包括调用进程的检查、Intent的检查、权限的检查、向PKMS获取启动Activity的ActivityInfo等信息,然后调用 startActivityUnchecked 方法开始对要启动的Activity做堆栈管理。
在 startActivityInner 方法中,根据启动模式计算出flag,在根据flag等条件启动的Activity的ActivityRecord是加入现有的Task栈中,还是创建新Task栈。为Activity准备好堆栈后,调用 RootWindowContainer.resumeFocusedStacksTopActivities 方法
ActivityStack对栈的管理:
对于启动Activity对应的 ActivityStack 来说,是管理其栈中Activity的显示逻辑。而后继续调用 ActivityStackSupervisor.startSpecificActivity
ActivityStackSupervisor检查启动进程和回调ApplicationThread
在ActivityStackSupervisor中先检查要启动Activity的进程是否存在,不存在则创建进程,存在则调用 realStartActivityLocked ,realStartActivityLocked方法通过事务给回调 ApplicationThread. scheduleTransaction 方法。
下图为ActivityThread启动Activity过程的时序图:
ApplicationThread类绕了一大圈,最后调用在ATMS阶段设置的ClientTransaction的CallBack的execute方法,也就是 LaunchActivityItem. execute 方法,此方法创建一个 ActivityClientRecord 对象,然后调用 ActivityThread. handleLaunchActivity 开启真正的Actvity启动。
真正启动Activity: