View绘制流程

问题:子线程可以更新view吗

setText会不断向上调用View.requestLayout

ViewRootImpl:checkThread方法的调用是关键

控件树的结构

setContentView时发生了什么

#Activity
getWindow().setContentView(layoutResID);

Activity内有一个PhoneWindow extend Window

#PhoneWindow
installDecor() {
    DecorView mDecor = generateDecor(-1);
    ViewGroup mContentParent = generateLayout(mDecor);
}

setContentView时PhoneWindow会创建一个DecorView extend Framelayout,这样window就和view联系起来了

然后generateLayout中会根据主题修改窗口布局,有两次一次从style.xml 另一次时requestWindowFeature的配置

#PhoneWindow
generateLayout (DecorView d) {
    根据主题找一个layoutResource
    mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);
}
#DecorView
void onResourcesLoaded(LayoutInflater inflater, int layoutResource) {
    final View root = inflater.inflate(layoutResource, null);
    addView(root, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}

把传入的 layoutResource add 进 DecorView

#PhoneWindow
ViewGroup contentParent = (ViewGroup)getDecorView().findViewById(之前layoutResource中的content)

拿出布局中的contentParent

#PhoneWindow
public void setContentView(int layoutResID) {
    mLayoutInflater.inflate(layoutResID, 上面的contentParent);
}

DecorView 的父控件 ViewRootImpl

ViewRootImpl在WindowManagerGlobal的addView中被创建–>WindowManagerImpl的addView方法 –> ActivityThread的handleResumeActivity方法

SurfaceView

独有一个surface,通过surfaceflinger合并与activity的surface绘制,总是处于最下层,所以wms把上层的view掏空,有待机黑屏问题,可以拿到surfaceview的canvanse,但也无法彻底解决