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.