添加一个window示例(代码示例参考任玉刚的安卓艺术探索)
WindowManager是外界访问window的入口,window的具体实现位于WindowManagerService中,windowManager和WinowManagerService的交互是一个IPC过程.
window是一个抽象的概念,每个window都对应一个View和ViewRootImpl,window和View通过ViewRootImpl来建立联系的。从源码看WindowManager是继承ViewManager,所以window的具体表现形式是view。
window的添加过程
从源码看,WindowManager是一个接口,真正实现window的添加,更新,删除由WindowManagerImpl类,WindowManagerImpl委托WindowManagerGlobal具体实现
分析源码:
WindowManagerGlobal addView内部核心代码
在addView方法里,会创建ViewRootImpl对象,由ViewRootImpl的对象处理重新布局和完成window的添加,scheduleTraversals()是view绘制入口。
ViewRootImpl类setView方法核心代码:
在系统接收任何事情之前执行重新布局。
由IWindowSession完成Window的添加,IWindowSession是一个AIDL接口,通过Session实现,Session最终交由WindowManagerService实现,WindowManagerService,Session都是Binder,由此可见Window的添加是一个IPC交互的过程。
window的删除
由源码看,Window的删除也是WindowManagerGlobal类实现。
removeViewLocked方法里面会创建ViewRootImpl,由viewRootImpl的最终由doDie方法去删除, die的结果返回表示为true的时候将待删除的viewm放到DyingViews稍后删除。
View的删除逻辑dispatchDetachedFromWindow方法里面,删除window以后,调用WindowManagerGlobal的doRemoveView方法清空mRoots,mParams,mDyingViews。
dispatchDetachedFromWindow方法里面首先调用mView.dispatchDetachedFromWindow()的方法,当view从window分离后调用onDetachedFromWindow,表示view不在被绘画,可以在这个方法内部做一些资源的回收工作,重写时候必须要调用super方法。
由IWindowSession完成Window的删除,IWindowSession是一个AIDL接口,通过Session实现,Session最终交由WindowManagerService实现
Window的刷新过程
由源码看,Window的刷新也是WindowManagerGlobal类实现。
就是更新WindowManager.LayoutParams。