关于android activity的层级理解

来源:互联网 发布:mysql常用的数据类型 编辑:程序博客网 时间:2024/06/17 05:08

关于android activity的层级理解

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


  • 先放一张网上找到的图,大致了解一下activity的层级关系和系统进程的关系,也感谢绘制图片的dalao这里写图片描述

    • 从上面图片可以看出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代码如下
@Overridepublic 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进行链接。