Activity启动流程(上)
与之前不同的是添加了ActivityStartController, ActivityStarter , ClientLifecycleManager
并且不同的状态是用的是 ActivityLifecycleItem,其子类有PauseActivityItem,LaunchActivityItem等,需要实现preExecute, execute,PostExecute 三个主要方法
并且ActivityThread 继承了ClientTransactionHandler,在scheduleTransaction 中执行preExecute,并发送消息到H中,在TransactionExecutor中执行execute和postExecute,execute执行handle方法,postExecute执行相应的回调
结构
启动结构图具体过程
1. Activity1调用startActivity,实际会调用Instrumentation类的execStartActivity方法,Instrumentation是系统用来监控Activity运行的一个类,Activity的整个生命周期都有它的影子。(1- 4)
2. 通过跨进程的binder调用,进入到ActivityManagerService中,其内部会处理Activity栈,通知Activity1 Pause,Activity1 执行Pause 后告知AMS。(5 - 29)
3. 在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。之后再通过跨进程调用进入到Activity2所在的进程中。(30 - 36)
4. ApplicationThread是一个binder对象,其运行在binder线程池中,内部包含一个H类,该类继承于类Handler。主线程发起bind Application,AMS 会做一些配置工作,然后让主线程 bind ApplicationThread,ApplicationThread将启动Activity2的信息通过H对象发送给主线程。发送的消息是EXECUTE_TRANSACTION,消息体是一个 ClientTransaction,即 LaunchActivityItem。主线程拿到Activity2的信息后,调用Instrumentation类的newActivity方法,其内通过ClassLoader创建Activity2实例。(37 - 40)
5. 通知Activity2去performCreate。(41 - 最后)
注:现在发送的都是EXECUTE_TRANSACTION ,通过 TransactionExecutor 来执行 ClientTransaction, ClientTransaction 中包含各种 ClientTransactionItem,如 PauseActivityItem、LaunchActivityItem、StopActivityItem、ResumeActivityItem、DestroyActivityItem 等,这些Item的execute方法来处理相应的handle,如handlePauseActivity、handleLaunchActivity等,通知相应的Activity来perform。
再盗一张图
activity启动时的进程间通信方式