WMS作为系统的一个关键服务其是在SystemServer.java::startOtherServices中启动的
WMS主要有下面几个作用:
1:应用程序通过WMS向SurfaceFinger申请surface,surface代表的是绘图表面,应用程序绘制都必须在绘图表面上.
2:管理窗口的层级,一个窗口一般在WMS端都是一个WindowState,其是有层级区分的,其有baseLayer和subLayer两个值共同确定.
3:窗口动画:WindowAnimator
其中上面有一个比较重要的对象PhoneWindowManager,主要是负责窗口管理的各种策略
AMS,WMS之间数据是对应的,通过token值可以在AMS,WMS,应用程序之后来唯一确定一组Window,token是关联着一组窗口的,可能有多个WindowState的token值是相同的.
整个启动过程涉及3个线程: system_server主线程, “android.display”, “android.ui”, 整个过程是采用阻塞方式(利用Handler.runWithScissors)执行的. 其中WindowManagerService.mH的Looper运行在 “android.display”进程,也就意味着WMS.H.handleMessage()在该线程执行。
本文主要是基于android10.0.0来讲述下WMS的启动流程
WMS作为系统的一个关键服务其是在SystemServer.java::startOtherServices中启动的
WMS主要有下面几个作用
1:应用程序通过WMS向SurfaceFinger申请surface,surface代表的是绘图表面,应用程序绘制都必须在绘图表面上
2:管理窗口的层级,一个窗口一般在WMS端都是一个WindowState,其是有层级区分的,其有baseLayer和subLayer两个值共同确定
3:窗口动画:WindowAnimator
其中上面有一个比较重要的对象PhoneWindowManager,主要是负责窗口管理的各种策略
WindowManagerPolicy mPolicy---------------->对应的实现类PhoneWindowManager,主要是窗口管理的策略和按键的处理
final ActivityManagerInternal mAmInternal------>对应的是AMS,持有AMS对象
final ActivityTaskManagerInternal mAtmInternal--->管理Task的,android10.0新增
final ArraySet<Session>mSessions = new ArraySet<>()---->会话,主要是建立和surfaceFinger的连接
final WindowHashMap mWindowMap = new WindowHashMap()---->缓存windowstate
AMS,WMS之间数据是对应的,通过token值可以在AMS,WMS,应用程序之后来唯一确定一组Window,token是关联着一组窗口的,可能有多个WindowState的token值是相同的
整个启动过程涉及3个线程: system_server主线程, “android.display”, “android.ui”, 整个过程是采用阻塞方式(利用Handler.runWithScissors)执行的. 其中WindowManagerService.mH的Looper运行在 “android.display”进程,也就意味着WMS.H.handleMessage()在该线程执行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)