伪代码讲解Activity启动流程

219 阅读1分钟

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