Android WindowManager continueSurfaceLayout流程
4:33 pm
Tuesday, 21 June 2022 (GMT+8)
Time in Guangzhou, Guangdong Province, China
- 概述
- WindowManagerService.continueSurfaceLayout
- RootWindowContainer.performSurfacePlacement
- requestTraversal
- 总结
概述
分析Android 10的WindowManagerService.continueSurfaceLayout()
流程。
WindowManagerService.continueSurfaceLayout
WMS.continueSurfaceLayout()
首先完成窗口、Surface的位置计算和摆放,并当RootWindowContainer.isLayoutNeeded()
时requestTraversal()
触发绘制流程。
RootWindowContainer.performSurfacePlacement
handleResizingWindows to WindowState流程
handleResizingWindows()
主要是将mResizingWindows
即大小改变的窗口回调resized()
方法,计算新的merged configuration后,通过IWindow
这个Binder发送到应用。其中,应用侧是ViewRootImpl
管理这个Binder并执行对应的业务逻辑。最终会回调ViewRootImpl.dispatchResized()
。
IWindow
是Framework调用ViewRootImpl时使用的(由ViewRootImpl.W
实现)IWindowSession
是ViewRootImpl调用Framework services使用的Binder。
ViewRootImpl.dispatchResized()流程
dispatchResized()
主要流程是将Binder传递的信息通过Message发送到Handler。其中,当reportDraw
为true时会发送不同的Message。这两个不同的Message的差异在于,reportDraw
为false时会检查Message内带的信息是否与当前的有差异。如果没有差异会忽略本次dispatch resized,否则执行流程和reportDraw
为true时一致。
可以这么认为,当信息没有更新时,MSG_RESIZED
跳过后面的工作,而MSG_RESIZED_REPORT
则一定会执行。其中,两个MSG对应的回调handle流程是一致的。
首先检查merged conf是否有更新并更新之。将新的Configuration通过sConfigCallback
回调到ActivityThread
,ActivityThread
执行handleConfigurationChanged()
流程,回调Activity、Service、Provider等的onConfigurationChanged()
。
然后更新mWinFrames
。接着按照条件触发report、layout等。
requestTraversal
最后如果满足条件还会再进行一次traversal。requestRraversal()
实际上就是通过Handler向AnimationThread
调度一次performSurfacePlacemtn()
。
总结
Surface Layout过程主要是摆放Surface、回调WindowState、通过Binder发送回到ViewRootImpl,并最终通过ActivityThread回调应用的onConfigurationChanged()。