学习笔记,整理中;
面:
自己思路整理:
概述:需要了解基本流程,作为应用层开发不用纠结细节;wms真正管理的decor view; 对view的 update,remove,add
1. WMS基本概念-WindowManagerService(WMS)
(1)Framework层的窗口管理服务
职责是管理Android系统中的所有的Window。窗口管理服务,继承IWindowManager.Stub,Binder服务端,因此WM与WMS的交互也是一个IPC的过程
- Z-ordered的维护函数
- 输入法管理
- AddWindow/RemoveWindow
- Layerout
- Token管理,AppToken
- 活动窗口管理(FocusWindow)
- 活动应用管理(FocusAPP)
- 转场动画
- 系统消息收集线程
- 系统消息分发线程
(2)Window
手机上一块显示区域,添加一个Window的过程,也就是申请分配一块Surface的过程
(3)Surface
每个显示界面的窗口都是一个Surface
(4)WindowManager(WM)
应用与窗口管理服务WindowManagerService交互的接口
(5)PhoneWindowManager
实现了窗口的各种策略,定义了窗口相关策略,比如:告诉WMS某一个类型Window的Z-Order的值是多少,帮助WMS矫正不合理的窗口属性,为WMS监听屏幕旋转的状态,预处理一些系统按键事件(例如HOME、BACK键等的默认行为就是在这里实现的)等
(6)Choreographer
用于控制窗口动画、屏幕旋转等操作,它拥有从显示子系统获取VSYNC同步事件的能力,从而可以在合适的时机通知渲染动作,避免在渲染的过程中因为发生屏幕重绘而导致的画面撕裂。WMS使用Choreographer负责驱动所有的窗口动画、屏幕旋转动画、墙纸动画的渲染
(7)DisplayContent - 用于描述多屏输出相关信息。
- 根据窗口的显示位置将其分组。隶属于同一个DisplayContent的窗口将会被显示在同一个屏幕中。每一个DisplayContent都对应这唯一ID,在添加窗口时可以通过指定这个ID决定其将被显示在那个屏幕中。
- DisplayContent是一个非常具有隔离性的一个概念。处于不同DisplayContent的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合
(8)WindowState
描述窗口的状态信息以及和WindowManagerService进行通信,一般一个窗口对应一个WindowState。它用来表示一个窗口的所有属性
(9)WindowToken - 窗口Token,用来做Binder通信;同时也是一种标识
- --> 在进行窗口Zorder排序时,属于同一个WindowToken的窗口会被安排在一起,而且在其中定义的一些属性将会影响所有属于此WindowToken的窗口,这些都表明了属于同一个WindowToken的窗口之间的紧密联系
- --> 应用组件在需要新的窗口时,必须提供WindowToken以表明自己的身份,并且窗口的类型必须与所持有的WindowToken的类型一致
- --> 在创建系统类型的窗口时不需要提供一个有效的Token,WMS会隐式地为其声明一个WindowToken,addWindow()函数一开始的mPolicy.checkAddPermission()的目的安全处理。它要求客户端必须拥有SYSTEM_ALERT_WINDOW或INTERNAL_SYSTEM_WINDOW权限才能创建系统类型的窗口
(10)Session
App进程通过建立Session代理对象和Session对象通信,进而和WMS建立连接
(11)SurfaceFlinger
SurfaceFlinger负责管理Android系统的帧缓冲区(Frame Buffer),Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的
(12)InputManager
IMS实例。管理每个窗口的输入事件通道(InputChannel)以及向通道上派发事件
(13)Animator
所有窗口动画的总管(WindowStateAnimator对象)。在Choreographer的驱动下,逐个渲染所有的动画
2. WMS基本概念-Activity相关变量
(1)mWindow
PhoneWindow对象,继承于Window,是窗口对象
(2)mWindowManager
WindowManagerImpl对象,实现WindowManager接口
(3)mMainThread
Activity对象,并非真正的线程,是运行在主线程里的对象
(4)mUIThread
Thread对象,主线程
(5)mHandler
Handler对象,主线程Handler
(6)mDecor
View对象,用来显示Activity里的视图
3. WMS基本概念-WMS启动流程分析
(1)SystemServer.startOtherServices
WindowManagerService.main -->DisplayThread.getHandler().runWithScissors 同步等待WMS初始化成功-->new WindowManagerService
mActivityManagerService.setWindowManager(wm)
wm.onInitReady() --> initPolicy-->runWithScissors
wm.displayReady() 初始化显示尺寸信息,结束后WMS会根据AMS进行一次configure
wm.systemReady() 直接调用mPolicy的systemready方法
(2)WMS重要成员变量-
mTokenMap-->保存所有显示令牌(类型为WindowToken),一个窗口必须隶属于某一个显示令牌。衍生变量还有:
- mAppTokens,保存了所有属于Activity的显示令牌(WindowToken的子类AppWindowToken),mAppTokens列表是有序的,它与AMS中的mHistory列表的顺序保持一致,反映了系统中Activity的顺序。
- mExitingTokens,保存了正在退出过程中的显示令牌等
-
mWindowMap-->保存所有窗口的状态信息(类型为WindowState),衍生变量还有
- mPendingRemove,保存了那些退出动画播放完成并即将被移除的窗口
- mLosingFocus,保存了那些失去了输入焦点的窗口
- 在DisplayContent中,也有一个windows列表,这个列表存储了显示在此DisplayContent中的窗口,并且它是有序的。窗口在这个列表中的位置决定了其最终显示时的Z序
mSessions-->保存了当前所有想向WMS寻求窗口管理服务的客户端。注意Session是具有进程唯一性
(3)总结
- WMS的启动主要涉及3个线程:system_server、android.display、android.ui;其中WMS.H.handleMessage 运行在android.display线程中
WMS中3个关键步骤:创建WMS对象,初始化显示信息,处理systemready通知
4. WMS基本概念-窗口类型
(1)应用窗口 (Application Window)
包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口,层级范围是1~99
(2)子窗口(Sub Window)
应用自定义的对话框,或者输入法窗口,子窗口必须依附于某个应用窗口(设置相同的token),层级范围是1000~1999
- FIRST_SUB_WINDOW=1000
- TYPE_APPLICATION_PANEL=FIRST_SUB_WINDOW
- TYPE_APPLICATION_MEDIA=FIRST_SUB_WINDOW+1
- TYPE_APPLICATION_SUB_PANEL=FIRST_SUB_WINDOW+2
- TYPE_APPLICATION_ATTACHED_DIALOG=FIRST_SUB_WINDOW+3
- TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4-->TYPE_APPLICATION_MEDIA的重影窗口,显示TYPE_APPLICATION_MEDIA和应用窗口之间
- LAST_SUB_WINDOW=1999 -->最后一个子窗口
(3)系统窗口(System Window)
系统设计,不依附于任何应用窗口,比如:状态栏(Status Bar)、导航栏(Navigation Bar)、壁纸(Wallpaper)、来电显示窗口(Phone)、锁屏窗口(KeyGuard)、信息提示窗口(Toast)、音量调整窗口、鼠标光标等等,层级范围是2000~2999 - FIRST_SYSTEM_WINDOW=2000 -->系统窗口,非应用程序创建
- TYPE_STATUS_BAR --> 状态栏,只能有一个状态栏,位于屏幕顶端,其他窗口都位于它下方
- TYPE_SEARCH_BAR --> 搜索栏,只能有一个搜索栏,位于屏幕上方
- TYPE_PHONE --> 电话窗口,它用于电话交互(特别是呼入),置于所有应用程序之上,状态栏之下,属于悬浮窗(并且给一个Activity的话按下HOME键会出现看不到桌面上的图标异常情况)
- TYPE_SYSTEM_ALERT --> 系统警告提示窗口,出现在应用程序窗口之上,属于悬浮窗, 但是会被禁止
- TYPE_TOAST -->信息窗口,用于显示Toast, 不属于悬浮窗, 但有悬浮窗的功能
- TYPE_SYSTEM_OVERLAY --> 系统顶层窗口,显示在其他一切内容之上,此窗口不能获得输入焦点,否则影响锁屏
- LAST_SYSTEM_WINDOW=2999 --> 最后一个系统窗口
下面是具体源码部分,了解了下,没具体看,等要做room开发的时候再细看,应用开发了解大概原理即可--------