3:09 pm
Thursday, 23 June 2022 (HKT)
Time in Hong Kong


概述

ATMS.resizeTask -> TaskRecord.resize

setWindowingMode()在窗口模式下是对ActivityStack操作resize()不同,resizeTask()是对TaskRecordresize()进行操作的。

TaskRecord设置bounds,更新Configuration并触发children同步更新,最后调用Task.resize()

resizeTask.TaskRecord.resize流程

Task.resize

Task.resize()的主要工作是,借助WindowContainer的体系,将resize bounds通过onConfigurationChanged()传递到children(AppWindowTokenWindowState)。并在此过程中通过Surface Transaction将Surface设置为指定的大小、摆放到指定位置。

最后,WindowState如果发现窗口大小改变,会将自身添加到WindowManagerService.mResizingWindows中。在一下一次traversal中,会有额外操作回调到WindowState(在handleResizingWindows()中回调WindowState.reportResized(),这个方法内部通过IWindow这个Binder回调到应用的ViewRootImpl.W.resized(),最终将窗口大小回调到App的ViewRootImpl)。

Task.resize流程

总结

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