背景
偶然发现一个点,就是在onCreate执行Handler.post在onResume后才执行,以下是测试代码
多次运行的结果一致,为什么execute runnable不是在onCreate和onResume之间执行的呢,带着疑问撸了一遍Activity启动流程
关键源码分析
-
通过分析Activity启动原理得知,onCreate执行前会发送一个EXECUTE_TRANSACTION的post消息
-
ActivityThread的Handler会执行该post消息
-
ClientTransaction是在ActivityStackSupervisor的realStartActivityLocked中创建的
由上面代码可知,ClientTransaction在Callback处添加了LaunchActivityItem(内部会执行Activity.onCreate),在LifecycleStateRequest处ResumeActivityItem(内部会执行Activity.onResume) -
在TransactionExecutor的execute方法内会依次执行callback和LifecycleStateRequest
综上分析得知,这里onCreate和onResume是在同一个消息(EXECUTE_TRANSACTION)内执行的,依照消息队列的特性,执行完该消息后才会去执行刚刚onCreate中post的消息