第八章,理解Window和WindowManager P309
8.1Window是分层的,每个Window都对应的z-oredered,层级大的会覆盖在层级小的上面。应用类层级范围1~99、子Window的层级范围1000~1999,系统Window的层级范围2000~2999,这些层级范围对应着WindowManager.LayoutPrams的type参数。
WindowManager继承ViewManager所提供的方法
添加View addView(View,ViewGroup.LayoutParams params)
更新View updateViewLayout(View view,ViewGroup.LayoutParams params)
删除View removeView(View view)
8.2Window的内部机制
每一个Window都对应着一个View和一个ViewRootImpl,Window和View是通过ViewRootImpl来建立联系,Window是以View的形式存在。
1.Window的添加过程
通过WindowManager的addView来实现。WindowManager是一个接口实现类WindowManagerImpl 。这个类交给WindowManagerGlobal来处理。
WindowManagerGlobal的addView实现过程:(1)检查参数是否合理,如果是子Window还需要调整一些布局参数
(2)创建ViewRootImpl并将View添加到列表中。存储View的表,存储ViewRootImpl得表,存储正在被删除的View的表等
(3)通过ViewRootImpl来更新界面并完成Window的添加过程。
2.删除过程WindowManagerImpl交给WindowManagerGlobal来处理 removeView首先通过findViewById来查找待删除View的索引(数组遍历)然后通过removeViewLocked来做进一步的删除。P317
3.更新过程WindowManagerGlobal的updateViewLayout方法 首先更新View的LayoutParams并替换掉老的,接着更新ViewRootImpl的LayoutParams,通过setLayoutParams方法实现。
8.3Window的创建过程
1.ActivityWindow的创建过程P320
2.Dialog的Window的创建过程P323
3.Toast的Window创建过程P326