Skip to content

Android | 理解 Window 和 WindowManager - 掘金

Window的概念

Window是一个抽象类,它的具体实现是PhoneWindow。Android中所有的视图都是通过Window来呈现的,所有Window实际上是View的直接管理者,可以看成是所有视图的载体。 例如在事件分发机制中,在Activity中里面收到的点击事件后,会首先通过Window将事件传递到DecorView,最后再分发到我们的View上

WindowManager添加View

Window是一个抽象的概念,它实际是不存在的,而是以各种view的实现展现。所以Window的访问要通过WindowManager的实现类WindowManagerImpl。

  1. 首先调用的是 WindowManagerImpl.addView()在 addView 中将实现委托给了 WindowManagerGlobal.addView()
  2. WindowManagerGlobal.addView(),在 addView 中创建了 ViewRootImpl 赋值给了 root 。然后将 view,params,root 全部存入了各自的列表中。最后调用了 ViewRootImpl.setView()
  3. ViewRootImpl.setView()在 setView 中通过调用 requestLayout 完成刷新的请求,其中 **scheduleTraversals() **是 View 绘制的入口
  4. 接着会通过IWindowSession 来完成最终的 Window 添加的过程,IWindowSession 是一个 Binder 对象,真正的实现类是 Session,也就是说 Window 的添加过程是一次 IPC 的调用。在 Session 中会通过 WindowManageServer 来实现 Window 的添加。
  • mViews 中是所有 Window 对应的 View
  • mRoots 中是所有 Window 对应的 ViewRootImpl
  • mParams 存储的是所有 Window 所对应的布局参数

这个ViewRootImpl是什么呢?或者说ViewRoot和WindowManager之间有什么联系呢? 我们知道WindowManager是是View的管理者,包括添加view,更新view,移除view等;而我们的DecorView是根View,ViewRoot就是他们两者的连接的桥梁,负责去完成View的绘制流程。