一、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机制相关推荐

  1. Android之window机制token验证

    文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Andr ...

  2. android token机制_Android之window机制token验证

    前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...

  3. Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    <div id="container">         <div id="header">     <div class=&qu ...

  4. Android异步消息处理机制 全解析

    Android异步消息处理机制主要是指Handler的运行机制以及Hanlder所附带的MessageQueue和Looper的工作过程. 本文将通过分析源码(api-28)的形式,全面解析Handl ...

  5. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  6. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...

  7. Android插件化原理解析——Hook机制之Binder Hook

    Android系统通过Binder机制给应用程序提供了一系列的系统服务,诸如ActivityManagerService,ClipboardManager, AudioManager等:这些广泛存在系 ...

  8. Android 插件化原理解析——Hook机制之AMSPMS

    在前面的文章中我们介绍了DroidPlugin的Hook机制,也就是代理方式和Binder Hook:插件框架通过AOP实现了插件使用和开发的透明性.在讲述DroidPlugin如何实现四大组件的插件 ...

  9. Android解析WindowManagerService(三)Window的删除过程

    相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在本系列文章中,我提到过:Window ...

最新文章

  1. APP-SQLAP-10771
  2. [深度学习]自然语言处理 --- ELMo
  3. 让ASP.NET Core支持GraphQL之-GraphQL的实现原理
  4. Python中append和extend的区别
  5. Debian 7.8 通过 apt-get 安装 nodejs
  6. 打造属于自己的Vim神器
  7. 分页存储过程2005
  8. [转]国内Linux操作系统发行商分类溯源
  9. 傻瓜式硬盘重装win7系统图文加视频教程
  10. 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布
  11. 输出滑动窗口最大值(双端队列)
  12. 格雷码与二进制之间转换及VHDL实现
  13. 第2章 关系数据库练习题
  14. 有一个3x4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号.
  15. 超好的赚钱方法 目前广告点击报酬最高的
  16. RemoteView流程
  17. 腾讯云仪征数据中心开服,辐射长三角产业数字化升级
  18. 专访超脑链团队:公链比联盟链更适合赋能传统企业
  19. Java日志管理最佳实践
  20. 企业为什么要申报高新技术企业

热门文章

  1. u大师u盘装系统win7_什么是u盘启动装系统 u盘启动装系统方法【介绍】
  2. 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享
  3. 看家本领系列:完美解决rem布局闪烁的问题
  4. 新浪微博想重构生态,但已经太晚
  5. 怎么把电脑硬盘文件恢复回来?跟着我这么做
  6. 4.11nbsp;拉弗曲线与税收分析
  7. mac nginx重启 及相关配置目录
  8. 判断当前页是否为最后一页
  9. 学习Windows Phone 7手机开发:迷你手电筒程序
  10. raid超级块组织,外部元数据与内部元数据