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。