Android:Activity、Window、View、RootViewImpl、WindowManager、WindowManagerGlobal、WMS作用和关系

Window:

Window是个抽象概念,这并不是因为它是个接口(它也有对应的实现类,如PhoneWindow),而是因为每个Window对应着一个根View和一个ViewRootImpl,这两者由WindowManagerGlobal持有管理,WindowManagerGlobal控制ViewRootImpl通过WindowSession与WMS通讯,通知根View在界面上的add、update、remove,这也可以看作是Window的add、update、remove。一个Window必定仅包含一个根View,也可以说Window以根View的形式存在。

Window有三种类型:应用Window、子Window、系统Window。应用Window对应一个Activity。子Window不能单独存在,必须依附在父Window上,比如PopWindow、Dialog。系统Window需要申明权限,一般浮在屏幕最上面(其z-ordered大于另外两种Window),如Toast。

ViewRootImpl:

ViewRootImpl作用如下:

  1. WindowManagerGlobal通过ViewRootImpl控制对应Window的根View(对于PhoneWindow来说,即DecroView);
  2. 完成View的绘制过程,包括measure、layout、draw过程;
  3. 向DecroView分发事件,如用户的按键/触屏等事件;
  4. 通过WindowManagerGlobal提供的WindowSession,来通知WMS完成Window的add、update、remove;

如图(图片来源网络):

Android:Activity、Window、View、RootViewImpl、WindowManager、WindowManagerGlobal、WMS作用和关系_第1张图片

ViewRootImpl由WindowManagerGlobal持有并控制,同时WindowManagerGlobal还持有ViewRootImpl对应的根View(对于PhoneWindow来说,即DecroView)和该View对应的LayoutParams。

WindowManager:

WindowManager是Window的管理者,它实现了ViewManager接口,该接口包含了我们关心的对View在界面上的add、update、remove方法。这个View,即Window,所以也可以看作是Window的add、update、remove方法。

一个Activity一般会持有一个Window(PhoneWindow)和一个WindowManager。该WindowManager实现类是WindowMangerImpl,通过context.getSystemService(Context.WINDOW_SERVICE)获取,getSystemService方法在第一次获取时创建,后续获取读缓存,所以整个App进程应该使用的同一个WindowMangerImpl。WindowMangerImpl里持有一个WindowManagerGlobal对象。该WindowManagerGlobal对象是个单例,被APP中所有的WindowManager共享。WindowManager通过委托WindowManagerGlobal,间接管理对应Window的add、update、remove。

WindowManager和其管理的Window(这里是说父Window,源码中为mParentWindow)相互持有各自引用。

WindowManagerGlobal:

WindowManagerGlobal是真正管理Window的add、update、remove的类。它是个单例,管理所有Window的根View和对应的ViewRootImpl。它包含4个列表,分别为:

  • ArrayList mViews——所有Window的根View;
    
  • ArrayList mRoots——所有根View对应的ViewRootImpl;
  • ArrayList
  • ArraySet mDyingViews——待销毁的根View(Window)

同时,WindowManagerGlobal也持有一个WindowSession(本质是个Binder),用于和WMS通讯。

 

关系图(图片来源网络):

Android:Activity、Window、View、RootViewImpl、WindowManager、WindowManagerGlobal、WMS作用和关系_第2张图片

 

总结:

一个Activity,对应一个DecorView,对应一个ViewRootImpl,对应一个PhoneWindow,可以有多个子Window;

App进程对应一个WindowManager,对应一个WindowManagerGlobal;

你可能感兴趣的:(Android)