Activity Start flow
流程
我们不必太抠细节,只要关注主流程和几个关键点就可以了。
主流程为:暂停原Activity->检测进程是否启动,启动进程->启动Activity
- 暂停原Activity: 通过PasueActivityItem实现Activity的暂停
- 启动进程:主要是通过zygote.process,该过程会创建ActivityThread和Instrumentation
- 启动Activity: 通过LaunchActivityItem。该过程会创建PhoneWindow和DecorView,设置主题
startActivity
-> 经过Instrumentation\ActivityTaskManagerService\ActivityStack\ActivityStackSupervisor
-> PauseActivityItem
-> 启动进程(zygote.process)
-> LaunchActivityItem
阶段详解
Create Process
下面代码可以看到一点,ActivityThread、Instrumentation每个进程只会有一个。
* ActivityTaskManagerService.startProcessAsync
* ProcessList.startProcess
* ZygoteProcess.start
* ActivityThread.main() -> Looper.get -> new ActivityThread -> activityThread.attach -> new Instrumentation -> looper.loop
LaunchActivityItem
这里是启动Activity的核心代码,在执行改代码之前是一系列的判断+调用,从App端调用到service端,service端又经过层层调用最终调到ActivityStackSupervisor.realStartActivityLocked中。
* ActivityTaskManagerService.getLifeCycleManager.scheduleTransaction
* ClientLifeCycleManager.scheduleTransaction
* ApplicationThread.scheduleTransaction
* ActivityThread.scheduleTransaction
* ClientTransactionHandler.scheduleTransaction -> sendMessage
* ActivityThread.H.EXECUTE_TRANSACTION
* LaunchActivityItem.execute
* ActivityThread.handleLaunchActivity
* ActivityThread.performLaunchActivity -> Instrumentation.newActivity -> r.packageInfo.makeApplication() -> activity.attach -> new PhoneWindow -> get DecorView
* Activity.setTheme
* Instrumentation.callActivityOnCreate
PauseActivityItem
* ActivityTaskManagerService.getLifeCycleManager.scheduleTransaction
* ClientLifeCycleManager.scheduleTransaction
* ApplicationThread.scheduleTransaction
* ActivityThread.scheduleTransaction
* ClientTransactionHandler.scheduleTransaction -> sendMessage
* ActivityThread.H.EXECUTE_TRANSACTION
* PauseActivityItem.execute
* ActivityThread.handlePauseActivity
* ActivityThread.performPauseActivity
* Instrumentation.callActivityOnPause