Android resizeTask流程详解
3:09 pm
Thursday, 23 June 2022 (HKT)
Time in Hong Kong
概述
ATMS.resizeTask -> TaskRecord.resize
与setWindowingMode()在窗口模式下是对ActivityStack操作resize()不同,resizeTask()是对TaskRecord的resize()进行操作的。
TaskRecord设置bounds,更新Configuration并触发children同步更新,最后调用Task.resize()。

Task.resize
Task.resize()的主要工作是,借助WindowContainer的体系,将resize bounds通过onConfigurationChanged()传递到children(AppWindowToken、WindowState)。并在此过程中通过Surface Transaction将Surface设置为指定的大小、摆放到指定位置。
最后,WindowState如果发现窗口大小改变,会将自身添加到WindowManagerService.mResizingWindows中。在一下一次traversal中,会有额外操作回调到WindowState(在handleResizingWindows()中回调WindowState.reportResized(),这个方法内部通过IWindow这个Binder回调到应用的ViewRootImpl.W.resized(),最终将窗口大小回调到App的ViewRootImpl)。

总结
resizeTask()以TaskRecord为起点,根据resize bounds计算对应的Configuration,并通过ConfigurationContainer体系分发。通过Task与WindowContainer体系分发到AppWindowToken和WindowState中。WindowContainer体系会在更新Configuration和bounds的同时,通过Surface Transaction更新Surface大小和位置。在一下次WMS的traversal时,就会完成窗口layout,最终完成resize。