Activity View Window的联系

2018-01-28  本文已影响17人  小锡兵鸥

Activity View Window分别是什么?

Activity : Android四大组件之一,存放View组件的容器,也是我们界面的载体,可以用来展示一个界面,它有一个setContentView()方法,可以将我们定义的布局设置到界面上。
View : 这个类代表了用户界面组件的基本构件。
Window: 抽象基类,用于顶级窗口外观和行为策略。The only existing implementation of this abstract class is android.view.PhoneWindow, which you should instantiate when needing a Window.

Activity的setContentView()都做了哪些操作呢

Activity.setContentView(intresId) 该方法在Activity类中,该方法只是简单的回调Window对象,具体为PhoneWindow对象的setContentView()方法实现。

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

public Window getWindow() { 
    return mWindow;   //Window对象,本质上是一个PhoneWindow对象 
} 

PhoneWindow.setContentView()方法

ViewGroup mContentParent;

    @Override
public void setContentView(int layoutResID) {
   ...
   //是否是第一次调用setContentView方法, 如果是第一次调用,则mDecor和mContentParent对象都为空  
    if (mContentParent == null) {
        installDecor();
    } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
    //如果没有设置过feature,移除其内部所有的子Views
        mContentParent.removeAllViews();
    }
    ...
}

mContentParent是个ViewGroup包含我们整个布局文件,installDecor就是去初始化mContentParent和创建DecorView

  private void installDecor() {
     if (mDecor == null) { //如果decorView为空,就生成一个
        mDecor = generateDecor(-1);
        ...
    }  else { //否则将phoneWindow设置到decorView上
        mDecor.setWindow(this);
    }
    if (mContentParent == null) { 
            //根据当前的主题设置根ViewGoup
        mContentParent = generateLayout(mDecor);
        ...
      } else {
            ...
      }
  }

DecorView

    DecorView(Context context, int featureId, PhoneWindow window,
        WindowManager.LayoutParams params) {
    super(context);
    mFeatureId = featureId;
        ...
        //把Android系统中的非标准度量尺寸转变为标准度量尺寸
    updateAvailableWidth();
    setWindow(window);
    ...
}

至此,Activity、View、Window就联系在一起了。即通过setContentView()方法,创建DecorView,并将Window设置上,再利用该DecorView生成一个ViewGroup。
可见,DecorView是核心。

上一篇下一篇

猜你喜欢

热点阅读