正文:
(网络盗图,侵删)
(网络盗图,侵删)
1. Window是一个抽象类,其实现是PhoneWindow。WindowManager是外界访问Window的入口。Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。Android中所有视图都是通过Window来呈现的,Activity、Dialog和Toast实际上都附加在Window上。因此Window实际是View的直接管理者。
2. Window有三种类型,分别是应用Window、子Window和系统Window。应用类Window对应着一个Activity。子Window不能单独存在,需要附属在特定的父Window之中,比如常见的一些Dialog。系统Window是需要声明权限才能创建的Window,比如Toast和系统状态栏。
3. Window是分层的,层级大的会覆盖在层级小的Window上面。层级范围顺序:系统Window>子Window>应用Window。层级范围对应WindowManager.LayoutParams的type参数。如果需要最大层级,可使用系统层级的type,但同时需要声明权限。
4. WindowManager继承自ViewManager。提供了三个常用方法:addView、updateViewLayout和removeView。
5. 每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系。Window并不实际存在,是以View的形式存在。
6. WindowManagerImpl并没有直接实现Window的三大操作,耳饰交给了WindowManagerGlobal处理,这种工作模式就是典型的桥接模式。
7. View是Android中的视图的呈现方式,但是View不能单独存在,必须附着在Window这个抽象的概念上面,因此有视图的地方就有Window。提供的视图除了Activity、Dialog、Toast以外,还有PopUpWindow、菜单。
8. Activity的Window是通过PolicyManager的一个工厂方法来创建的。具体实现就是PhoneWindow。
8. PhoneWindow的setContentView方法:创建DecorView -> 添加View到DecorView的mContentParent -> 回调Activity的onContentChanged方法 -> 调用Activity的makeVisible方法(DecorView和WindowManager连接)
9. Dialog的Window创建过程:创建Window -> 初始化DecorView并将Dialog的视图添加到DecorView中 -> 将DecorView添加到Window中并显示。
10. 普通的Dialog必须使用Activity的Context。也可以制定对话框的Window为系统类型,也可以正常弹出对话框。主要是Window的问题:普通Dialog是子Window,必须附着在父Window上。
11. Toast基于Window实现,但由于具有定时取消功能,因此系统采用了Handler。Toast内部有两类IPC。Toast属于系统Window。
文献:
1. 感谢提供以上两幅图的网友伙伴
2. 张大神:《Android开发艺术探索》