关于android activity的层级理解

关于android activity的层级理解

学习acitivty绘制的时候看到了activity的层级结构,也学习了一下也算是稍微了解了activity的层级结构,通过博客和源码记录一下自己的学习


  • 先放一张网上找到的图,大致了解一下activity的层级关系和系统进程的关系,也感谢绘制图片的dalao关于android activity的层级理解_第1张图片

    • 从上面图片可以看出activity的层级可以看出整个activty的层级其实分为->phoneWindow->DecorView(包含TitleView [例如actionbar,StatusBar等] 和contentView [我们自己编写的界面] )

    • 通常我们编写的界面代码在setContentView中,从Activity的源码可以看出,activity将其交给了window来完成,window是activity的一个成员变量,仅有一个实现类PhoneWindow,PhoneWindow

public void setContentView(@LayoutRes int layoutResID) {
     getWindow().setContentView(layoutResID);  //调用getWindow方法,返回mWindow
     initWindowDecorActionBar();
}
  • 来到PhoneWindow中,setContentView代码如下
@Override
public void setContentView(int layoutResID) {
    // Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
    // decor, when theme attributes and the like are crystalized. Do not check the feature
    // before this happens.
    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); 
    }
    final Callback cb = getCallback();
    if (cb != null && !isDestroyed()) {
        cb.onContentChanged();
    }
}
  • 首先会对mContentParent进行判定,如果为空则进行installDecor()操作,这个操作其实是进行mDecor的初始化,即DecorView,源码如下
private void installDecor() {
    if (mDecor == null) {
        mDecor = generateDecor(); 
        ...
    }
    if (mContentParent == null) {
        mContentParent = generateLayout(mDecor); 
        ...
        } 
    }
}

DecorView中存在着界面布局信息,从这里可以看出他是mContentParent的父类,也是存在于PhoneWindow中的一个成员变量。如果在viewTree中来看,DecorView是其根节点,viewRoot负责管理viewTree。从上面图也可以看出,ViewRoot这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow跟WindowManagerService,每创建一个phoneWindow,便会创建一个相应的viewRoot进行链接。

你可能感兴趣的:(android)