1. 简介
从上一篇文章:从setContentView揭开DecorView 中可以看到,Activity是怎么将我们的布局加载到DecorView,但是这时还不是可见的,因为这时布局还没有绘制。那么它是怎么绘制的,我们来研究一下。
本文源码基于android 27
2. 源码分析
虽然DecorView已经被创建出来了,但是目前DecorView跟PhoneWindow是没有任何关系的。那么DecorView是怎么添加到PhoneWindow上面的呢。这个操作实际上在Activity启动时就完成了,关于Activity的启动可以看下这篇文章:Activity启动过程详解。我们直接来看相关代码,在ActivityThread的handleResumeActivity()会将DecorView添加到PhoneWindow上面:
2.1 ActivityThread的handleResumeActivity
final void handleResumeActivity(IBinder token,
boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
//...
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();//获得当前Activity的PhoneWindow对象
View decor = r.window.getDecorView();//获得当前phoneWindow内部类DecorView对象
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();//得当当前Activity的WindowManagerImpl对象
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (r.mPreserveWindow

本文主要探讨了ViewRootImpl在Android系统中的作用,从ActivityThread的handleResumeActivity开始,详细分析了WindowManagerImpl和WindowManagerGlobal如何参与View的添加,接着重点讲解了ViewRootImpl的setView、requestLayout以及performTraversals方法,揭示了View绘制的整个过程。文章还提供了一个时序图以辅助理解。
最低0.47元/天 解锁文章
2228

被折叠的 条评论
为什么被折叠?



