window是一个抽象类,它的具体实现时PhoneWindow,创建window是由windowManager来完成的
android的所有视图都是通过window来呈现的,activity、toast、Dialog都是附加在window上的,window是view的直接管理者
window的3中类型:应用window、子window和系统window
- 应用window:对应着一个Activity
- 子window:不能单独存在,要附加在父window上
- 系统window:需要声明权限在能创建的window
window是分层的,层级大的会覆盖在层级小的上面
windowManager提供了添加View、更新View、删除View方法,这三个方法定义在ViewManager中,而WindowManager继承了ViewManager
windowManger可以创建一个window并向其中添加View,更新window中的View,删除一个Window就是删除window中的view就行了
window中的内部机制
每个Window对应着一个View和一个ViewRootImpl,window和view是通过viewRootImpl类建立联系的,window并不是实际存在的,它是以View的形式存在的,在实际应用中无法直接访问window,要通过windowManager来访问
window添加过程
通过windowManager的addView来实现,实际操作时由WindowManagerGlobal来实现的,最终window的添加请求是交给WindowManagerSevice去处理的
Window删除过程
和添加过程一样,先通过WindowManagerImpl后,在进一步通过WindowManagerGlobal来实现的,内部具体的删除操作是由ViewRootImpl的die方法来完成的,删除view分同步删除和异步删除,异步删除会发出一个MSG_DIE的消息,ViewRootImpl的Handler会处理此消息并调用doDie方法,同步删除直接调用doDie方法,doDie方法内部会调用dispatchDetachedFromWindow方法,真正删除View的逻辑在这个方法中
dispatchDetachedFromWindow方法主要做:
- 垃圾回收
- 通过session的remove方法删除window,最终会调用WindowManagerService的removeWindow方法
- 调用view的onDetachedFromWindow方法,view从window中移除会调用此方法
- 调用WindowManagerGlobal的doRemoveView方法更新数据
window的创建(activity)
activity的启动最终是由activityThread中的performLaunchActivity方法来完成的,这个方法内部会通过类加载器创建activity的实例对象,并调用其attach方法关联运行过程中的上下文环境
**在attach方法内,系统会创建activity所属的window对象并为其设置回调接口
- 如果没有ViewDecor就创建一个
- 将View添加到ViewDecor的content中
- 回调activity的onContentChanged方法
- 将ViewDecor添加到window中