Android PhoneWindow,ViewRoot,Activity之间的大致关系。
在android里,我们都知道activity.但是一个activity跟一个Window是一个什么关系呢?
在activity.java中,我们可以看到两个变量,分别是:
private Window mWindow;
private WindowManager mWindowManager;
这这个变量是在哪里赋值的呢?可以看到attach函数,
mWindow = PolicyManager.makeNewWindow(this);
跟进去看一下,可以发现返回的时候一个PhoneWindow对象,PhoneWindow是Window类的派生类。
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
仔细跟踪下这段代码中我们可以得到WindowManager对象,并且这个对象是在系统唯一的,这个对象同样被赋值给PhoneWindow的成员变量。
我们在新建一个activity的时候,往往喜欢用如下的代码来定义该activity的UI界面,那么这个具体的实现是怎么来实现的呢?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
我们跟踪setContentView就知道了。可以发现activity其实把这个操作交给了自己的mWindow来完成,通过跟踪PhoneWindow中的setContentView函数可以得出以下知识:
1,每一个PhoneWiondow中都有一个叫DecorView的对象,该对象是该PhoneWiondow的框架view,可以找到这么一段代码:
View in = mLayoutInflater.inflate(layoutResource, null);
decor.addView(in, new ViewGroup.LayoutParams(FILL_PARENT, FILL_PARENT));
该layoutResource则是资源ID,通过往上翻代码就可以找得到。
2,一个PhoneWiondow中都有一个叫FrameLayout的对象mContentParent,该对象是从上述layoutResource中的布局xml中获得的,这也将是activity中所有用户新增加view都会被包含在这个对象当中。
总体可以这样大致说明:一个activity包含有一个PhoneWiondow对象,而所有的UI部件都是放在PhoneWiondow中。