对Window及WindowManager的理解

自从接触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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值