摘要
本文主要从源码层面讲述:
- Application、Activity何时被创建,生命周期函数何时被调用;
- 视图View是何时添加到Window上的。
先看一张自己用Chrome插件Gliffy画的一张相对简洁的Android之ActivityThread的调用图,这张图只是红色标注了一些生命周期的函数调用处以及一些关系处理。
从这张图可以很明显看出:
- LoadedApk#makeApplication()方法实现->Application的创建、onCreate()函数调用;
- ActivityThread#performLaunchActivity()方法实现->Activity的创建、Window的创建(由PhoneWindow实现)、WindowManager的设置(由WindowManagerImpl实现)、onCreate()、onStart()、onRestoreInstanceState()函数调用;
- ActivityThread#handleResumeActivity()方法实现->Activity的onResume()函数调用、DecorView的创建、DecorView与Window的关系建立、DecorView与WindowManager的关系建立;
- WindowManagerGlobal#addView()方法实现->ViewRootImpl的创建、ViewRootImpl与DecorView的关系建立;
- 让DecorView对用户真正可见。
从以上调用顺序可以得出结论:
- 在Activity的onResume()函数调用后,DecorView才真正可见;
- ViewRootImpl.performTraversals()是开始View绘制的关键方法。
如果想看完整详细的关于Activity的启动流程图以及View绘制得以触发的流程图,请点下面两张图:
参考
- View绘制流程
- 浅析 android 应用界面的展现流程(四)创建绘制表面
- 《Android开发艺术探索》
- Android应用层View绘制流程与源码分析