Activity的启动流程
我们可以将Activity划分为两种类型,根Activity和子Activity。
根Activity:以快捷图标的形式显示在Launcher中,它的启动过程代表了一个Android应用程序的启动过程。
子Activity:由根Activity或其他字Activity启动,他们有可能与启动他们的Activity运行在同一个进程中,也可能运行在不同的进程中。
因此,接下来我们将分析根Activity的启动流程,其他两种启动流程类似
根Activity的启动流程
子Activity在进程内的启动流程
子Activity在新进程的启动流程
根Activity的启动流程
我们以Launcher组件启动新的应用程序的MainActivity为例。其过程大概分为以下6步:
(1) Launcher组件向ActivityManagerService发送一个启动MainActivity的进程间通信请求
(2) ActivityManagerService首先将要启动的MainActivity信息保存起来,然后再向Launcher发送一个进入终止状态的进程间通信请求
(3) Launcher组件进入终止状态后就会向ActivityManagerService发送一个已经进入终止状态的进程间通信请求,以便ActivityManagerService可以继续执行MainActivity的启动
(4) ActivityManagerService发现用于运行MainActivity的应用程序进程不存在,因此会先启动一个新的应用程序进程
(5) 新的应用程序进程启动后就会向ActivityManagerService发送一个启动完成的进程间通信请求,以便ActivityManagerService可以继续执行MainActivity的启动
(6) ActivityManagerService将第二步保存起来的MainActivity信息发送第四步创建的新的应用程序进程,以便将MainActivity启动起来
注:以ActivityManagerService为中心,我将此6步称为“三进三出”
接下来我们详细分析每一个步骤:
Step1~Step5:
Step1: Launcher.startActivitySafely
Step2:Activity.startActivity
Step3:Activity.startActivityForResult
Step4:Instrumentation.execStartActivity
Step5:ActivityManagerProxy.startActivity
Step1-Step5通知ActivityManagerService要启动新的Activity了(在Launcher所在进程执行)。
Step6~Step12:
step6:ActivityManagerService.startActivity
step7:ActivityStack.startActivityMayWait
step8:ActivityStack.startActivityLocked
step9:ActivityStack.startActivityUncheckedLocked, ActivityStack.startActivityLocked
step10:ActivityStack.resumeTopActivityLocked
step11:ActivityStack.startPausingLocked
Step6-Step12通知Launcher程序应该pause Launcher的Activity了(在ActivityManagerService所在进程执行)
step8的ActivityStack.startActivityUncheckedLocked会检查有没有在AndroidManifest中注册即将要启动的Activity,如果没有注册,会返回一个ActivityStack.startActivityUncheckedLocked,然后Instrumentation.execStartActivity返回后回去检查这个值,然后抛出异常。
step9的ActivityStack.startActivityUncheckedLocked方法或去判断是否需要创建一个新的任务来启动Activity。在默认情况下,目标Activity与源Activity是运行在同一个任务中的,然而,如果源Activity将目标Activity的启动标志的FLAG_ACTIVITY_NEW_TASK设置为1,并且源Activity不需要知道目标Activity的运行结果,那么目标Activity就会运行在与源Activity不同的任务中。至于是否新建一个任务,则取决于目标Activity的taskAffinity属性,ActivityManagerService会先去查找taskAffinity属性所代表的任务是否已经存在,如果taskAffinity属性所代表的任务已经存在,则会将目标Activity置于该任务的栈顶,如果不存在,则先创建一个新的任务,并将目标Activity置于栈顶。
step10的ActivityStack.resumeTopActivityLocked方法会获取目前处于栈顶的正在激活的Activity,并通知Launcher应该pause掉这个Activity以便启动新的Activity。
Step13~Step17:
step13:ApplicationThread.schedulePauseActivity
step14:ActivityThread.queueOrSendMessage
step15:H.handleMessage
step16:ActivityThread.handlePauseActivity
step17:ActivityManagerProxy.activityPaused
step13-step17:pause Launcher的Activity,并通知ActivityManagerService已经pause结束了(在Launcher所在进程执行)
Step18~Step23
step18:ActivityManagerService.activityPaused
step19:ActivityStack.activityPaused
step20:ActivityStack.completePauseLocked
step21:ActivityStack.resumeTopActivityLocked
step22;ActivityStack.startSpecificActivityLocked
step23:ActivityManagerService.startProcessLocked
step18-step23:创建一个新进程,调用ActivityThread.main方法(执行在ActivityManagerService进程)。这其中,ActivityManagerService会先检查目标Activity所需的应用进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity,否则,会先调用Process.start创建一个新的应用程序进程。
注:这里就是与在同一个进程中启动Activity的区别之处
Step24~Step25:
step24:ActivityThread.main
step25:ActivityManagerProxy.attachApplication
step24-step25:创建ActivityThread实例,初始化一些数据,进入Loop循环(执行在新创建的进程)
Step26~Step29:
step26:ActivityManagerService.attachApplication
step27:ActivityManagerService.attachApplicationLocked
step28:ActivityStack.realStartActivityLocked
step29:ApplicationThreadProxy.scheduleLaunchActivity
step26-step29:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在ActivityManagerService进程)
Step30~Step35:
step30:ApplicationThread.scheduleLaunchActivity
step31:ActivityThread.queueOrSendMessage
step32:H.handleMessage
step33:ActivityThread.handleLaunchActivity
step34:ActivityThread.performLaunchActivity
step35:MainActivity.onCreate
step30-step35:加载MainActivity类,调用onCreate声明周期方法(执行在新进程)
————————————————
原文链接:https://blog.youkuaiyun.com/weixin_36045176/article/details/80259942