Android解析Window机制
一、window介绍
什么是window
什么是view树?例如你在布局中给Activity设置了一个布局xml,那么最顶层的布局如LinearLayout就是view树的根,他包含的所有view就都是该view树的节点,所以这个view树就对应一个window。
- Activity、popupWindow、Toast、dialog、menu都有自己的view树,分别对应不同的window
- view树是window的存在形式,window是view树的载体
- window是view树的管理者,同时也是view树的载体。他是一个抽象的概念,本身并不存在,view树是window的表现形式
window的作用
window机制就是为了管理屏幕上的view的显示以及触摸事件的传递问题。
popupWindow、Toast、dialog、menu都是需要通过创建window来实现。
二、Window的相关属性
window的type属性
- 应用程序窗口:应用程序窗口一般位于最底层,Z-Order在1-99
- 子窗口:子窗口一般是显示在应用窗口之上,Z-Order在1000-1999
- 系统级窗口:系统级窗口一般位于最顶层,不会被其他的window遮住,如Toast,Z-Order在2000-2999。如果要弹出自定义系统级窗口需要动态申请权限。
Z-Order越大,window越靠近用户,也就显示越高,高度高的window会覆盖高度低的window,系统为我们三类window都预设了静态常量。
Window的flags参数
flag控制的范围包括了:各种情景下的显示逻辑(锁屏,游戏等)还有触控事件的处理逻辑。控制显示确实是他的很大部分功能,但是并不是全部。
window的solfInputMode属性
这一部分就是当软件盘弹起来的时候,window的处理逻辑,这在日常中也经常遇到,如:我们在微信聊天的时候,点击输入框,当软键盘弹起来的时候输入框也会被顶上去。如果你不想被顶上去,也可以设置为被软键盘覆盖。
window的其他属性
- x与y属性:指定window的位置
- alpha:window的透明度
- gravity:window在屏幕中的位置,使用的是Gravity类的常量
- format:window的像素点格式,值定义在PixelFormat中
三、Window的添加过程
window的添加过程是通过PhoneWindow对应的WindowManagerImpl来添加window,内部会调用WindowManagerGlobal来实现。WindowManagerGlobal会使用viewRootImpl来进行跨进程通信让WMS执行创建window的业务。
每个应用都有一个windowSession,用于负责和WMS的通信,如ApplicationThread与AMS的通信。
- 从Activity的启动流程可以得到Activity创建Window的过程,创建PhoneWindow -> 创建WindowManager -> 创建decorView -> 利用windowManager把DecorView显示到屏幕上。
- popupWindow也是利用windowManager来往屏幕上添加window,但,popupWindow是依附于activity而存在的,当Activity未运行时,是无法弹出popupWindow的,通过源码可以知道,当调用onResume方法的时候,其实后续还有很多事情在做,这个时候Activity也是尚未完全启动,所以popupWindow不能在onCreate、onStart、onResume方法中弹出。
- dialog的创建过程Activity比较像:创建PhoneWindow,初始化DecorView,添加DecorView。
四、window机制的关键类
window相关
window的实现类只有一个:PhoneWindow,他继承自Window抽象类。
WindowManager相关
windowManager就是window管理类。这一部分的关键类有windowManager,viewManager,windowManagerImpl,windowManagerGlobal。windowManager是一个接口,继承自viewManager。viewManager中包含了我们非常熟悉的三个接口:addView,removeView,updateView。
windowManagerImpl和PhoneWindow是成对出现的,前者负责管理后者。WindowManagerImpl是windowManager的实现类,但是他本身并没有真正实现逻辑,而是交给了WindowManagerGlobal。WindowManagerGlobal是全局单例,windowManagerImpl内部使用桥接模式,他是windowManager接口逻辑的真正实现。
view相关
这里有个很关键的类:ViewRootImpl。每个view树都会有一个。当我使用windowManager的addView方法时,就会创建一个ViewRootImpl。ViewRootImpl的作用很关键:
- 负责连接view和window的桥梁事务
- 负责和WindowManagerService的联系
- 负责管理和绘制view树
- 事件的中转站
每个window都会有一个ViewRootImpl,viewRootImpl是负责绘制这个view树和window与view的桥梁,每个window都会有一个ViewRootImpl。
WindowManagerService
这个是window的真正管理者,所有的window创建最终都要经过windowManagerService。整个Android的window机制中,WMS绝对是核心,他决定了屏幕所有的window该如何显示如何分发点击事件等等。
window与PhoneWindow的关系
这里的window是指window概念。
- PhoneWindow并不是view容器,而是window容器。
- PhoneWindow本身不是真正意义上的window,他更多可以认为是辅助Activity操作window的工具类。
- windowManagerImpl并不是管理window的类,而是管理PhoneWindow的类。真正管理window的是WMS。
- PhoneWindow可以配合DecorView可以给其中的window按照一定的逻辑提供标准的UI策略
- PhoneWindow限制了不同的组件添加window的权限
五、从Android架构角度看Window
PhoneWindow其实不是Window,只是一个window容器
六、比较Activity、Dialog、PopupWindow、Toast
各个类型窗口添加视图流程
为什么系统在创建Acivity或者Dialog的时候封装了PhoneWindow对象,而PopupWindow、Toast以及我们自己写悬浮窗口的时候并没有使用PhoneWindow对象?
- PhoneWindow的一个作用是给view包裹上一层DecorView。而DecorView中的布局结构,会根据requestWindowFeature()的不同而不同。
- Activity和Dialog的布局都比较复杂,比如都可能有appbar (toolbar/actionbar)等,因此通过PhoneWindow来封装可以更好的解耦代码。
- PopupWindow或者Toast的布局比较简单,因此没有必要包裹一层PhoneWindow。
参考链接
https://blog.csdn.net/weixin_43766753/article/details/108350589
https://blog.csdn.net/weitangzhu_2008/article/details/86705926
Android解析Window机制相关推荐
- Android之window机制token验证
文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Andr ...
- android token机制_Android之window机制token验证
前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
<div id="container"> <div id="header"> <div class=&qu ...
- Android异步消息处理机制 全解析
Android异步消息处理机制主要是指Handler的运行机制以及Hanlder所附带的MessageQueue和Looper的工作过程. 本文将通过分析源码(api-28)的形式,全面解析Handl ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
- Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程
前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...
- Android插件化原理解析——Hook机制之Binder Hook
Android系统通过Binder机制给应用程序提供了一系列的系统服务,诸如ActivityManagerService,ClipboardManager, AudioManager等:这些广泛存在系 ...
- Android 插件化原理解析——Hook机制之AMSPMS
在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...
- Android解析WindowManagerService(三)Window的删除过程
相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在本系列文章中,我提到过:Window ...
最新文章
- APP-SQLAP-10771
- [深度学习]自然语言处理 --- ELMo
- 让ASP.NET Core支持GraphQL之-GraphQL的实现原理
- Python中append和extend的区别
- Debian 7.8 通过 apt-get 安装 nodejs
- 打造属于自己的Vim神器
- 分页存储过程2005
- [转]国内Linux操作系统发行商分类溯源
- 傻瓜式硬盘重装win7系统图文加视频教程
- 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布
- 输出滑动窗口最大值(双端队列)
- 格雷码与二进制之间转换及VHDL实现
- 第2章 关系数据库练习题
- 有一个3x4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号.
- 超好的赚钱方法 目前广告点击报酬最高的
- RemoteView流程
- 腾讯云仪征数据中心开服,辐射长三角产业数字化升级
- 专访超脑链团队:公链比联盟链更适合赋能传统企业
- Java日志管理最佳实践
- 企业为什么要申报高新技术企业