美文网首页
View的绘制流程——第三篇

View的绘制流程——第三篇

作者: 丸子哒哒哒 | 来源:发表于2019-05-09 10:19 被阅读0次

    PhoneWindow.setContentView
    mContentParent:
    这是放置窗口内容的视图。要么是mdecor本身,或内容所在的mdecor的子级。
    mDecor:
    窗口的顶级视图,包含window decor

    1.如果mContentParent为空,初始化installDecor
    【1】如果mDecor为null,调用generateDecor,new DecorView(context, featureId, this, getAttributes())
    【2】如果mDecor不为null,将当前的phonewindow对象设置给他mDecor.setWindow(this);
    【3】如果mContentParent为null,调用generateLayout,
    ViewGroup contentParent=(ViewGroup)findViewById(ID_ANDROID_CONTENT)

    2.如果mContentParent不为空,将所有的子View移除
    3.mLayoutInflater.inflate(layoutResID, mContentParent);把传入的View添加到mContentParent
    4.mContentParentExplicitlySet设置为true,在requestFeature中,如果mContentParentExplicitlySet为true就会抛出异常,所以requestFeature一定要在setContentView之前调用

    以上仅仅是分析了,初始化decorview,以及它的子布局,但是好像和activity的window没有关联性,我们找到activityThread当中的handleResumeActivity方法,
    if (r.window == null && !a.mFinished && willBeVisible) {
    r.window = r.activity.getWindow();
    View decor = r.window.getDecorView();

    if (a.mVisibleFromClient) {
    if (!a.mWindowAdded) {
    a.mWindowAdded = true;
    wm.addView(decor, l);

    也就是说在activity的onResume生命周期调用的时候,关联起来
    同时还在源码中发现:
    Looper.myQueue().addIdleHandler(new Idler());
    也就是说,IdleHandler也是在onResume声明周期的时候调用

    相关文章

      网友评论

          本文标题:View的绘制流程——第三篇

          本文链接:https://www.haomeiwen.com/subject/gpbioqtx.html