毕业一年了,都没有找到时间对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()的方法之前,不然就空指针了,那具体是什么时候呢