Android---WMS核心分析
创始人
2025-05-31 21:25:25

目录

Activity 与 Window 相关概念

WindowManagerService 

Activity 相关变量 

WMS 启动流程分析 

 窗口类型

1. 应用窗口

2. 子窗口

3. 系统窗口

从 Activity 启动角度看 WMS

 窗口的显示次序

 Activity 启动窗口

WindowManagerService(WMS) 管理窗口的创建、更新和删除和显示顺序等,是 WindowManager这个管理接口的真正实现类。它运行在 System_Server 进程,作为服务端,客户端(应用程序)通过IPC 调用和它进行交互。

WindowManager 用来在应用与 window 之间的管理接口,管理窗口顺序、消息等。 

WMS 是在 SystemServer进程里的 startOtherService() 函数里启动。

Activity 与 Window 相关概念

  \bullet Activity 只负责生命周期和事件处理

  \bullet Window 只控制视图(view)

  \bullet 一个 Activity 包括一个 Window,如果 Activity 没有 Window,那就相当于 Service

  \bullet AMS 统一调度应用程序的所有 Activity

  \bullet WMS 控制所有 Window 的显示与隐藏以及要显示的位置

 Window

"Window" 表明它是和窗口相关的,“窗口”是一个抽象的概念,从用户的角度来讲,它是一个“界面”,从 SurfaceFlinger 的角度来看,它是一个 Layer,承载着和界面有关的数据和属性,从 WMS角度来看,它是一个 WindowState,用于管理和界面有关的状态。

  \bullet 表示一个窗口的概念,是所有 View 的直接管理者,任何视图都通过 Window 呈现(点击事件--> DecorView --> View; Activity 的 setContentView 底层通过 Window 完成

  \bullet Window 是一个抽象类,具体实现是 PhoneWindow

  \bullet 创建 Window 需要通过 WindowManager 创建

  \bullet WindowManager 是外界访问 Window 的入口

  \bullet Window 具体实现位于 WindowManagerService 中

  \bullet WindowManager 和 WindowManagerService 的交互是通过 IPC 完成的

  \bullet   定义窗口样式和行为的抽象基类,用于作为顶层的 view 加到 WindowManager 中,其实现类是 PhoneWindow。

  \bullet  每个 Window 都需要指定一个 Type(应用窗口子窗口系统窗口)。Activity 对应的窗口是应用窗口PopupWindowContextMenuOptionMenu 是常用的子窗口 Toast系统警告提示框(如 ANR)就是系统窗口,还有很多应用的悬浮框也属于系统出窗口类型。

Token

 这里提到的 Token 主要是指窗口令牌(Window Token),是一种特殊的 Binder 令牌,WMS 用它唯一标识系统中的一个窗口。

 

WindowManagerService 

PhoneWindowManager

实现了窗口的各种策略,定义了窗口相关策略。比如:告诉 WMS 某一个类型 Window 的 Z-Order的值是多少,帮助 WMS 矫正不合理的窗口属性,为 WMS 监听屏幕旋转的状态,预处理一些系统按键事件(例如HOMW、BACK 键等的默认行为就是在这里实现的)等。

Choreographer

用于控制窗口动画、屏幕旋转等操作,它拥有从显示子系统获取 VSYNC 同步事件的能力,从而可以在合适的事件通知渲染动作,避免在渲染的过程中因为发生屏幕重绘而导致的画面撕裂。WMS 使用 Choreographer 负责驱动所有的窗口动画、屏幕旋转动画、墙纸动画的渲染

DisplayContent

用于描述多屏幕输出相关信息。根据窗口的显示位置将其分组。隶属于同一个 DisplayContent 的窗口将会被显示在同一个屏幕中。每一个 DisplayContent 都对应一个唯一的ID,在添加窗口时可以通过指定这个 ID 决定其将被显示在那个屏幕中。DisplayContent 是一个非常具有隔离性的一个概念。处于不同 DisplayContent 的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合。

WindowState

描述窗口的状态信息以及和 WindowManagerService 进行通信,一般一个窗口对应一个 WindowState。它用来表示一个窗口的所有属性

WindowToken

在进行窗口 Z-Order 排序时,属于同一个 WindowToken 的窗口会被安排在一起,而且在其中定义的一些属性将会影响所有属于此 WindowToken 的窗口,这些都表明属于同一个 WindowToken 的窗口之间的紧密联系。

应用组件在需要新的窗口时,必须提高 WindowToken 以表明自己的身份,并且窗口的类型必须与持有的 WindowToken 的类型一致。

在创建系统类型的窗口时不需要提高一个有效的 Token,WMS 会隐式的为其声明一个 WindowToken,看起来谁都可以添加系统级的窗口。难道 Android 为了内部方便而置安全于不顾了吗?非也,addWindow() 函数一开始的 mPolicy.checkAddPermission() 的目的就是如此。它要求客户必须拥有 SYSTE_ALERT_WINDOW 或 INTERNAL_SYSTEM_WINDOW 权限才能创建系统类型的窗口。

Session

App 进程通过建立 Session 代理对象和 Session 对象通信,进而和 WMS 建立连接。

SurfaceFlinger​​

SurfaceFlinger 负责管理 Android 系统的帧缓冲区(Frame Buffer),Android 设备的显示屏被抽象为一个帧缓冲区,而 Android 系统中的 SurfaceFlinger 服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面。

InputManager

IMS 实例。管理每个窗口的输入事件通道以及向通道上派发事件

Animator

所有窗口动画的总管(WindowStateAnimator 对象)。在 Choreographer 的驱动下,逐个渲染所有的动画。

Activity 相关变量 

\bullet mWindow: PhoneWindow 对象,继承于 Window,是窗口对象

\bullet mWindowManager: WindowManagerImpl 对象,实现 WindowManager 接口

\bullet mMainThread: Activity 对象,并非真正的线程,是运行在主线程里的对象

\bullet  mUIThread: Thread 对象,主线程

\bullet  mHandler: Handler 对象,主线程 Handler

\bullet  mDecor: View 对象,用来显示 Activity 里的视图

WMS 启动流程分析 

1. startOtherService 完成初始化

2. WMS 中3个重要的成员变量:mTokenMap、mWindowMap、mSessions 

总结:

WMS 的启动主要涉及3个线程:system_server、android.display(displayThread,WMS 的初始化也是在这个线程中完成)、ui线程。其中 WMS.H.handleMessage 运行在 android.display 线程中。WMS 中3个关键步骤:创建 WMS 对象,初始化显示信息,处理 systemready 通知。

 窗口类型

1. 应用窗口

应用窗口(Application Window): 包括所有应用程序自己创建的窗口,以及应用起来之前系统负责显示的窗口,层级范围是1~99。

2. 子窗口

子窗口(Sub Window): 应用自定义的对话框或者输入法窗口。子窗口必须依附于某个应用窗口(设置相同的 token),层级范围是 1000~1999。

3. 系统窗口

系统窗口(System Window): 系统设计,不依附于任何应用窗口,比如:状态栏(StateBar)、导航栏(NavigationBar)、壁纸(WallPaper)、来电显示窗口(Phone)、锁屏窗口(KeyGuard)、来信提示窗口(Toast)、音量调整窗口、鼠标光标等待,层级范围是 2000~2999。

从 Activity 启动角度看 WMS

 1. Activity.attach

创建的 WindowManager 对象是保存在 mWindowManager 对象中的。通过 getWindowManager()方法获取到 WindowManager 对象。

WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance() 实际上 WindowManagerImpl 类中的各种方法最后都是转调 WindowManagerGlobal 来实现的,由此可见,一个应用中所有的 Activity 都是通过这个进程内唯一的 WindowManagerGlobal 对象和 WMS 之间进行通信,WindowManagerGlobal 中有3各重要的成员变量。

  \bullet 保存所有顶层 View 的对象(DecorView);

Private final ArrayList mViews = new ArrayList();

  \bullet 保存与顶层 view 相关联的 ViewRootImpl 对象;

private final ArrayList mRoots = new ArrayList();

   \bullet 保存创建顶层 View 的 layout 参数;

private final ArrayList mParams = new ArrayList();

 2. ActivityThread.handleResumeActivity

ViewRootImple 是 view 联系 WMS 之间的一个桥梁。

WindowContainer/WindowContainterController 管理我们的窗口:显示的次序、窗口的尺寸

 在 WMS 中,WindowState 对象代表一个窗口。

 3. DecorView

在 PhoneWindow 类中,mDecor 的类型是 DecorView,当调用 setContentView 时,如果 mDecor 还没有创建,则会调用 installDecor 方法来创建 Activity 中的 DecorView 和其他框架的 View。

 窗口的显示次序

 手机屏幕是以左上角为原点,向右为 X 轴方向,向下为 Y 轴方向的二维空间。为了方便管理窗口显示次序,手机屏幕被扩展为一个三维空间,多定义了一个 Z 轴,方向为垂直于屏幕表面指向屏幕外。多个窗口依照其前后顺序排布在这个虚拟的 Z 轴上,因此,窗口的显示次序右被称为 Z 序(Z-Order)

WMS.addWindow: 当 app 添加一个 View 的时候最终会调用到这里。

 Activity 启动窗口

ActivityStarter.startActivityLocked

 

 

相关内容

热门资讯

1.0奥拓真实油耗多少(铃木奥... 今天给各位分享1.0奥拓真实油耗多少的知识,其中也会对铃木奥拓10手动挡油耗进行解释,如果能碰巧解决...
长城哈弗m4报价及图片(长城哈... 本篇文章极速百科给大家谈谈长城哈弗m4报价及图片,以及长城哈弗h4新车报价2021款对应的知识点,希...
历史中诸葛亮一共几次北伐曹魏,... 历史中诸葛亮一共几次北伐曹魏目录历史中诸葛亮一共几次北伐曹魏诸葛亮北伐几次三国演义中诸葛亮六次北伐分...
卤水的做法及配方,卤料的配方大... 卤水的做法及配方目录卤水的做法及配方卤料的配方大全?卤水的制作?卤菜的卤汁怎么做?卤水的做法及配方 ...
VC是什么,vc是什么? 极速... VC是什么目录VC是什么vc是什么?VC指什么?vc是什么意思?VC是什么 VC是风险投资(V...
半妖倾城的结局是什么,半妖倾城... 半妖倾城的结局是什么目录半妖倾城的结局是什么半妖倾城结局是be吗电视剧(半妖倾城)结局是什么?半妖倾...
排除通用新君越6T40E自动变... 今天给各位分享排除通用新君越6T40E自动变速器烧片故障的知识,其中也会对别克君越变速箱维修视频进行...
女生日常的基本化妆都需要哪些东... 女生日常的基本化妆都需要哪些东西目录女生日常的基本化妆都需要哪些东西女生日常的基本化妆都需要哪些东西...
支付宝蚂蚁森林怎么刷能量 极速... 支付宝蚂蚁森林怎么刷能量目录支付宝蚂蚁森林怎么刷能量支付宝蚂蚁森林怎么刷能量 蚂蚁森林是支付宝...
足球禁区是什么意思,足球比赛中... 足球禁区是什么意思目录足球禁区是什么意思足球比赛中的“禁区”是指什么?足球场上大禁区小禁区的含义是什...
说唱里面的time是什么意思哈... 说唱里面的time是什么意思哈目录说唱里面的time是什么意思哈说唱中的time是什么意思Hey S...
怎么把电脑音量调节更大,电脑声... 怎么把电脑音量调节更大目录怎么把电脑音量调节更大电脑声音怎么调大怎么才能把电脑的声音调的更大点?如何...
岁末将至敬颂冬绥什么意思,岁末... 岁末将至敬颂冬绥什么意思目录岁末将至敬颂冬绥什么意思岁末将至的下一句是什么?岁末将至,敬颂冬绥是什么...
乌合之众的乌是指什么动物(乌合... 本篇文章极速百科给大家谈谈乌合之众的乌是指什么动物,以及乌合之众的动物是什么生肖对应的知识点,希望对...
什么是有理数(什么是有理数定义... 今天给各位分享什么是有理数的知识,其中也会对什么是有理数定义进行解释,如果能碰巧解决你现在面临的问题...
绿萝施什么肥料长得好,绿萝最好... 绿萝施什么肥料长得好目录绿萝施什么肥料长得好绿萝最好的肥料是啥绿萝施什么肥?绿萝用什么肥料长得快 让...
古剑奇谭3开场动画及结局剧情分... 古剑奇谭3开场动画及结局剧情分析目录古剑奇谭3开场动画及结局剧情分析古剑奇谭3开头怎么那么长仙剑3的...
新华字典中方字的笔划顺序是什么... 新华字典中方字的笔划顺序是什么目录新华字典中方字的笔划顺序是什么方子的笔画中国汉字的总方针是先上,后...
和地球最相似的星球叫什么,最像... 和地球最相似的星球叫什么目录和地球最相似的星球叫什么最像地球的星球与地球最相似的星球叫什么?和地球最...
什么是几九,几九是什么意思 极... 什么是几九目录什么是几九几九是什么意思今天是几九了啊,一九,二九,三九,四九,五九,是什么意思什么是...
东北都有什么特色小零食啊,东北... 东北都有什么特色小零食啊目录东北都有什么特色小零食啊东北特产零食东北特色小吃东北三省各自有什么特色零...
化妆棉的作用有哪些,化妆棉的作... 化妆棉的作用有哪些目录化妆棉的作用有哪些化妆棉的作用化妆棉有什么作用?化妆棉的作用有哪些 1....
六道有哪六道,火影忍者六道能力... 六道有哪六道目录六道有哪六道火影忍者六道能力六道轮回,都有哪六道?六道是指哪六道?六道有哪六道 ...
飞信手机多方通话怎么用(飞信手... 本篇文章极速百科给大家谈谈飞信手机多方通话怎么用,以及飞信手机好友收费吗对应的知识点,希望对各位有所...
会计中的流动资产包括哪些,下列... 会计中的流动资产包括哪些目录会计中的流动资产包括哪些下列会计科目中,属于流动资产的是(  )。会计基...
旺旺碎冰冰是什么梗的简单介绍 ... 本篇文章极速百科给大家谈谈旺旺碎冰冰是什么梗,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站...
怎样给芭比做衣服,给芭比娃娃做... 怎样给芭比做衣服目录怎样给芭比做衣服给芭比娃娃做衣服怎么做不用缝怎样帮芭比娃娃做衣服怎样给芭比做衣服...
如何区分,植物油,矿物油,白油... 本篇文章极速百科给大家谈谈如何区分,植物油,矿物油,白油,液蜡?,以及怎么区别植物油和矿物油对应的知...
武汉空气为什么那么差(为什么武... 本篇文章极速百科给大家谈谈武汉空气为什么那么差,以及为什么武汉空气质量这么差对应的知识点,希望对各位...
美国4大全尺寸皮卡之一,性能不... 本篇文章极速百科给大家谈谈美国4大全尺寸皮卡之一,性能不输福特猛禽,通用塞拉...,以及美国皮卡车品...