对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的显示和隐藏的。
- 对Window及WindowManager的理解
- 对Window和WindowManager的理解
- Window和WindowManager的理解
- 理解Window和WindowManager
- 理解Window和WindowManager
- 理解window和windowManager
- 理解Window和WindowManager
- 理解window和windowmanager
- 理解Window和WindowManager
- 理解Window和WindowManager
- 深入理解Window、WindowManager
- 理解Window和WindowManager
- Android快速理解Activity、View及Window&WindowManager之间关系
- Android快速理解Activity、View及Window&WindowManager之间关系
- 读书笔记--理解Window和WindowManager
- Android 理解Window 和 WindowManager
- android对于window,windowManager窗口管理的理解
- 浅谈对Window的理解
- UML类图和包图
- 1021. 个位数统计
- 1002 数塔取数问题 51NOD
- 正则表达式
- spring mvc xml配置
- 对Window及WindowManager的理解
- Winform:自定义滚动条——可自定义皮肤
- 随机打印50个随机(4-10长度)的字符串,要求字符串包含的范围是所有的英文字母包含大小写和数字,按照编码顺序排序,每行打印4个,要求首字符对齐
- 漫步数学分析二十四——连续函数空间
- 2. Add Two Numbers
- PHP函数
- 课程学习归纳总结(0301)
- 尚未重新应用microsoft visual studio 2010 service pack 1 :系统无法找到指定的对象
- leetcode经典编程题(8)