窗口,可以理解为一个可以提供给用户交互的用户界面,在这个界面里,用户可以通过物理按键事件,触摸事件等输入事件和应用程序或者系统进行交互。
总体来说,窗口就是一个可交互的ViewGroup,Android系统在某一时刻只会有且只有一个窗口获得焦点并且处于活跃状态,可以接收各种事件。
窗口参数包括大小,类型等。
在Android系统里,窗口主要有如下几种窗口
应用窗口(WindowManager.TYPE_APPLICATION)
状态栏窗口(WindowManager.TYPE_STATUS_BAR)
输入法窗口(WindowManager.TYPE_INPUT_METHOD)
Window 类是一个抽象类,PhoneWindow是它的一个实现,它是一个具有交互功能视图的抽象。并不是所有的窗口都会有Window类,如输入法窗口就没有Window类修饰视图。Activity所在的窗口是由PhoneWindow修饰的。
PhoneWindow,持有一个DecorView,这个视图将Activity设置的contentView作为子视图,PhoneWindow表示一个应用窗口,每一个Activity都持有一个PhoneWindow
WindowManager,是一个接口,它的作用是将窗口添加到WindowManagerService,它只有一个实现类,WindowManagerImpl,WindowManagerImpl在系统中只有一个实例。但是WindowManagerImpl,也只是一个壳子,真正添加窗口的工作是由WindowManagerGlobal完成的.WindowManagerGlobal同样也只有一个实例。WindowManagerImpl添加窗口的时候不会检查窗口的参数,WindowManagerGlobal则会检查窗口的参数。
ViewRootImpl,它会保存窗口的视图,一个窗口视图对应一个ViewRootImpl.ViewRootImpl持有一个W对象,W实现了IWindow接口,它是一个Binder服务,这个W对象主要用于WindowManagerService向ViewRootImpl反馈消息。
IWindowSession,它是一个Binder接口,Session实现IWindowSession.Session持有WindowManagerService对象。Session,表示一个正在和WindowManagerService进行交互的会话,每一个视图都会有对应的Session.
IWindwoManager,是一个Binder对象,WindowManagerService实现这个接口。
WindowManagerService里它所理解的窗口就是一个视图,但是它并不持有具体的视图对象,WindowManagerService根据视图的参数通过ViewRootImpl 的W对象以及Session的IWindowSession对象和ViewRootImpl进行交互,控制视图的显示、关闭。