androidframework13-14-wms

学习笔记,整理中;

面:


自己思路整理:

概述:需要了解基本流程,作为应用层开发不用纠结细节;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开发的时候再细看,应用开发了解大概原理即可--------


5. 从Activity启动角度看WMS

6. 窗口的显示次序分析

7. 窗口的尺寸计算

8. ConfigarationContainer之间的联系

9. Activity启动窗口


摘要:


内容:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容