带着如下几个问题去听课
- ActivityThread起到的是什么作用?
- Activty的生命周期oncreate 和onResume 在ui绘制流程中做了哪些事情?
- View是如何添加到window上面?
- 为什么View的更新不能在子线程?
ActivityThread起到的是什么作用
ActivtityThread是activity里面的各个生命周期方法的执行入口。里面都是通过Handler去实现的。
Activty的生命周期oncreate 和onResume 在ui绘制流程中做了哪些事情?
onCreate只是把View添加到window上面,并没有开始测量,布局。测量和布局是在onresume执行的。
具体的源码可以从ActivityThread的performLaunchActivity。 这里面会通过调用WindowManager.addView(decorView, params),然后通过windowManager可以一层层的追溯到ViewRootImpl。 viewRootImpl通过调用setView方法后会执行到requestlayout方法。 requestLayout方法在往后就通过编舞者,来调用performMeasure, performLayout, perormDraw,从而达到测量,布局,绘制的目的。
View是如何添加到window上面
Activity.setContentView ------> Window.setContentView(window是一个抽你类,只有唯一的一个实例PhoneWindow)
最后就调用到了PhoneWindow.setContentView
installDecorView(创建顶层view为FrameLayout子类DecorView) ------> 根据不同的主题加载相应的布局添加到顶层View上面 ------> 由于每个布局上面必定有id为android.R.id.content控件,因此setContentView的布局最后是添加到了android.R.id.content的Frame上面的。
为什么View的更新不能在子线程?
那是因为在ViewRootImpl调用 setView方法后, 里面有一个checkThread方法, 判断了当前线程是否为主线程。 如果不是主线程,则抛出异常。因为ui更新必须在主线程里面才能完成。