对Window及WindowManager的理解

来源:互联网 发布:23years old牙膏 知乎 编辑:程序博客网 时间:2024/05/17 18:28

自从接触android开发以来,碰到的问题也有不少,有时候也会碰到dialog显示问题提示没有附着的token,类似这种问题一直困扰着自己,因此想起来写这篇文章来加深对Window和WindowManager的理解。

Window确切来说是一种抽象概念,每一个Window对应一个View和一个ViewRootImpl,Window和View通过ViewRootImpl建立联系,Window是以View的形式存在,必须通过WindowManager来访问Window。Window的具体实现是PhoneWindow,并且有WindowManager来管理Window的创建,删除,更新;Window是View的直接管理者,响应各种事件;Window可以分为三个级别分别是应用Window层级范围1~99(Activity),子Window层级范围1000~1999(Dialog),系统Window层级范围2000~2999(Toast/通知栏),层级越大代表越在顶层一般创建Window可以定义type,flags等属性。

WindowManager管理Window的内部过程是这样的:首先WindowManager的实现类WindowManagerImpl会委托WindowManagerGlobal来向外提供自己的实例,内部的四个List分别存储View,ViewRootImpl,mParams及正在被删除的View对象,对View管理最终会IPC调用WindowManagerService的addWindow方法,具体细节大家可以阅读源码,这里不再详细讨论。

Window的实体存在远端的WindowManagerService中,所以增删改在本端是修改上面的List,然后通过ViewRootImpl重绘View,最后通过WindowSession(一个应用一个)在远端修改Window

Activity创建Window过程:Activity的attach方法会创建相应的Window对象并实现Window中定义的Callback回调接口,当有Window有事件触发,Activity就会执行相应的回调函数(dispathTouchEvent,onDetachedFromWindow,onAttachedToWindow);并且Activity的Window最终是由Policy类创建PhoneWindow的;setConentView最终也是在PhoneWindow中执行;setContentView内部流程可以分为以下几步:

1、我们知道DecorView是Activity的顶级View,如果没有DecorView就创建一个DecorView,而且将具体布局加载到DecorView中

2、将View添加到DecorView中的mContentParent中

3、最终在Activity调用makeVisible函数中,DecorView被WindowManager添加到Window中并显示出来

Dialog创建Window过程与Activity创建Window过程类似

Toast创建Window过程:Toast的显示和隐藏都需要通过NotificationManagerService来实现,并且是通过IPC的方式显示和隐藏Toast,在IPC过程中,TN类也就是Binder类的方法会被最终调用来处理Toast的显示和隐藏的。



1 0
原创粉丝点击