1.View和ViewRoot
ViewRoot并不是View树的一部分,ViewRoot和View没有血缘关系,既不是子类也不是父类,ViewRoot是View树的管理者,ViewRoot有一个mView成员变量,该变量指向View树的根节点。
ViewRoot的核心任务是与WindowManagerService通信
2.Activity和Window的关系
Activity支持UI显示,但Activity并没有直接管理View树或者通过ViewRoot来管理View树,Activity并没有和这两者有直接的联系,而是通过中间的Window对象来建立联系
private Window mWindow;
3.Window和WindowManagerImpl
Window是面向Activity的,表示UI界面的外框,框里面的东西包括布局和内容等,是由Window的子类来规划的。Window的另一层含义是与WindowManagerService进行通信,但它并没有自己直接实现这一功能,原因是:一个应用程序中可能存在多个Window,如果它们都单独和WMS通信的话,既浪费资源,又会造成管理混乱,换句话说它需要统一的管理,于是就有了WindowManager,它作为Window的成员变量mWindowManager存在。
4.ViewRoot和WindowManagerImpl
WindowManagerImpl将工作交由WindowManagerGlobal进行处理在WindowManagerGlobal当中
private final ArrayList<View> mViews = new ArrayList<View>();
private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
private final ArrayList<WindowManager.LayoutParams> mParams =
new ArrayList<WindowManager.LayoutParams>();
5.ViewRoot和WindowManagerService
ViewRoot的实现类ViewRootImpl中有一个ViewRootGlobal其中有一个变量
private static IWindowSession sWindowSession;
该变量用于ViewRootGlobal到WMS的连接,该变量通过WMS的openSession方法获取,在此基础上,IwindowSession的add方法会提供一个IWindow对象,从而让WMS也通过BInder对象来与ViewRoot进行双向通信。
Paste_Image.png从ViewRootImpl到WMS的通信利用的是IWindowSession,从WMS到ViewRootImpl用的是IWindow
网友评论