转载自:http://blog.csdn.net/android_jiangjun/article/details/45798221
Android源码(2.3.5)\frameworks\base\core\java\android\view
public interface ViewManager{
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
//这里的WindowManager是一个接口,通过getSystemService
//通过这个方式可以获得许多的系统服务,比如电话,闹钟,电源管理
//WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
public interface WindowManager extends ViewManager {
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
}
}
public class WindowManagerImpl implements WindowManager {
private View[] mViews; //表示View树的根节点
private ViewRoot[] mRoots; //ViewRoot
private WindowManager.LayoutParams[] mParams; //Window的属性
它们分别用于表示View树的根节点、ViewRoot以及Window的属性。由此也可以看出,一个进程中不仅有一个ViewRoot;
而Activity与ViewRoot则是一对一的关系。自Android4.3开始对此做了修改,WindowManagerImpl不再直接存储上述三个数组变量,
而是由一个称为“WindowMangerGlobal”的类统一管理。
public void addView(View view){}
public void addView(View view, ViewGroup.LayoutParams params){}
private void addView(View view, ViewGroup.LayoutParams params, boolean nest){}
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
//这相当于“view”树的管理者,它有一个mView成员变量,指向的是它所管理的view树的根
//ViewRoot的核心任务就是与WindowManagerService进行通信
//这个ViewRoot存在于2.3.7以前,到4.0.1中就改了,4.0.1以后都是ViewRootImpl
//5、ViewRoot和WindowManagerService的关系 每一个ViewRootImpl内部,都有一个全局变量 static IWindowSession sWindowSession;
//这个变量用于ViewRoot到WMS的连接,它是ViewRoot利用WMS的openSession()接口来创建得到的。在此基础上,
// ViewRoot也会通过IWindowSession.add()方法提供一个IWindow对象——从而让WMS也可以通过这个IBinder对象来与ViewRoot进行双向通信。
//这里突然间冒出一个ViewRootImpl类,其实ViewRoot与ViewRootImpl的功能是一样的,只不过是Android不同版本的不同称呼。
public final class ViewRoot extends Handler implements ViewParent,View.AttachInfo.Callbacks {
View mView;
}
public final class ViewRootImpl extends Handler implements ViewParent,
View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
}
public abstract class Window {
mContext
private WindowManager mWindowManager; //拿到的是WindowManagerImpl的实例
}
//以上的类都是在Android源码\frameworks\base\core\java\android\view
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2 {
private Window mWindow;
private WindowManager mWindowManager;
final void attach(....){
mWindow = PolicyManager.makeNewWindow(this);
}
public Object getSystemService(String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
}
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager;
} else if (SEARCH_SERVICE.equals(name)) {
ensureSearchManager();
return mSearchManager;
}
return super.getSystemService(name);
}
}
其实每个Application都有一个ActivityThread主线程以及mActivities全局变量,后者记录了运行在应用程序中的所有Activity对象。
一个Activity对应唯一的WindowManager以及ViewRootImpl。WindowManagerGlobal作为全局管理者,
其内部的mRoots和mViews记录了Activity的ViewRootImpl和View树的顶层元素。ViewRootImpl的另一个重要角色就是负责与WMS通信。
从ViewRootImpl到WMS间的通信利用的是IWindowSession,而反方向则是由IWindow来完成的。
最后补充说明一点:Activity中有一个成员变量mWindow,mWindow里面有一个成员变量mWindowManager,
而mWindowManager是WindowMangerImpl类实例的引用,另外WindowMangerImpl里面包含ViewRoot(不管老版本中直接包含,还是新版本中间接包含)。