Activity的setContentView到底做了什么

Activity 的 setContentView

getWindow().setContentView(layoutResID);

Activity 的getWindow

return mWindow;

Activity 的attach

mWindow = new PhoneWindow(this, window, activityConfigCallback);

很明显Activity 的 setContentView最终调用的是PhoneWindow的setContentView

PhoneWindow的 setContentView

初始化了DecorView,(DecorView实际上是一个 FrameLayout),在 DecorView 中默认自带一个 mContentParent(实际上是一个 ViewGroup)。我们自己实现的布局是被添加到 mContentParent 中的。

PhoneWindow的setContentView完成了DecorView和界面布局的初始化

onCreate 阶段只是初始化了 Activity 需要显示的内容,而在 onResume 阶段才会将 PhoneWindow 中的 DecorView 真正的绘制到屏幕上。
在 ActivityThread 的 handleResumeActivity 中,会调用 WindowManager 的 addView 方法将 DecorView 添加到 WMS(WindowManagerService)

WindowManager 的 addView

初始化ViewRootImpl ,调用setView

ViewRootImpl 的 setView做了三件事

1、调用requestLayout 刷新布局,调用此方法后 ViewRootImpl 所关联的 View 也执行 measure - layout - draw 操作;
2、调用 mWindowSession 的 addToDisplay 方法将 View 添加到 WMS 中;
3、设置输入事件的处理

ViewRootImpl 显示布局和设置事件处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值