毕业一年了,都没有找到时间对Android技术进行整理,疲于项目工作,发现对一些基础性的疑惑没有进行追根溯源。若想在技术方面有所提升,对源码的解读是必须要迈过去的坎。以后要继续坚持写博客了。
1. Activity.setContentView()到底做了什么?执行了此方法,就开始渲染视图(执行ViewRootImpl.performTransversal)了吗?
首先回答:setContentView只是建立了View树,并没有进行渲染工作(其实真正的渲染工作是在onResume之后,后面我会从源码角度讲到)。也正是建立了View树,因此我们可以通过findViewById()来获取到View对象,但是由于并没有进行渲染视图的工作(没有执行ViewRootImpl.performTransversal),其实没有进行渲染工作的直接感受是,在onResume()方法里直接获取View.getHeight()/View.getWidth()得到的结果总是0,这是因为View还没有执行onMeasure()。
下面细细琢磨一下setContentView的流程:
setContentView->都是调用的PhoneWindow.setContentView()(注:PhoneWindow是Window的唯一实现类)。
那么这里的PhoneWindow对象(Activity.mWindow)是在何时进行初始化的呢?显然是在onCreate()的方法之前,不然就空指针了,那具体是什么时候呢?
ActivityThread.performLaunchActivity()->Activity.attach()

知道了如何初始化PhoneWindow,那么PhoneWindow具体做了什么工作呢?

本文深入探讨了Android中Activity.setContentView()的执行过程,解释了为何在onCreate()中使用View.post()能获取View宽高。通过分析PhoneWindow的初始化、View的渲染时机以及ViewRootImpl的角色,揭示了Android视图系统的工作原理。
最低0.47元/天 解锁文章
627

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



