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启动时的进程间通信方式

启动流程下

你可能感兴趣的:(Activity启动流程(上))