Activity的显示流程

Activity并不负责视图控制,它只是控制生命周期和处理事件,真正控制视图的是Window。一个Activity包含了一个Window,Window才是真正代表一个窗口,Window 中持有一个 DecorView,而这个DecorView才是 view 的根布局

作为一个Activity,它要显示出来,必须要经过如下流程

1、在Activity中调用attach进行一系列值的初始化,其中创建了一个Window对象,然而Window是一个抽象类,所以其实创建的是其子类(实现类)PhoneWindow

    private Window mWindow;

    final void attach(......) {
        ......
        mWindow = new PhoneWindow(this, window);
        ......
    }

2、在Activity中调用setContentView(R.layout.xxx),实际上是调用的getWindow().setContentView(),即调用PhoneWindow中的setContentView方法

    public void setContentView(@LayoutRes int layoutResID) {
        getWindow().setContentView(layoutResID);
        initWindowDecorActionBar();
    }

3、在PhoneWindow中的setContentView方法会检测是否有mContentParent(ViewGroup)的对象,如果没有的话执行installDecor()方法来创建它:

    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();
        }

        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);
        } else {
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }
        ......
    }

4,在installDecor()方法中,会先检查是否有mDecor(DecorView)对象,如果没有的话会先创建mDecor,然后使用mDecor创建mContentParent

    private void installDecor() {
        if (mDecor == null) {
            mDecor = generateDecor(-1);
            ......
        } else {
            mDecor.setWindow(this);
        }
        if (mContentParent == null) {
            mContentParent = generateLayout(mDecor);
            ......
        }
    }

5,在获取到mContentParent之后,就会开始对它进行填充,如果mContentParent并非新建的话,会检查是否在它里面已经有子view存在,如果有的话会先移除,然后使用布局填充器参照R.layout.xxx将子view填充进去

mLayoutInflater.inflate(layoutResID, mContentParent);

其实还有另外一个参数不同的setContentView方法,不过他们最后填充内容的具体实现都是调用ViewGroup的addView()方法进行子view的填充

其实Activity的层级关系如下图:

- Activity:负责控制生命周期和事件
- PhoneWindow:负责控制显示视图相关的操作
- DecorView:负责承载视图控件(TitleActionBar和ViewGroup,其中ViewGroup可以包含很多子View和ViewGroup)

你可能感兴趣的:(android)