关于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代码如下
@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进行链接。