Android8.0多窗口调研
一、概述
Android8.0上面原生的多窗口功能支持四种模式:全屏、分屏、画中画、FreeForm模式。多窗口主要涉及ActivityManagerService、WindowManagerService、Input三个模块。以下分析基于Android8.0代码。
二、原理框架
Android原生多窗口是多Stack方案,即存在多个ActivityStack。ActivityStack是一个抽象的栈,每个栈都有自己的屏幕区域bound和id,Activity是以Task方式组织并放在某一个Stack中的。比如,Launcher、Recents属于id=HOME_STACK的栈中。8.0主要涉及以下:
HOME_STACK_ID、FULLSCREEN_WORKSPACE_STACK_ID、FREEFORM_WORKSPACE_STACK_ID、DOCKED_STACK_ID、PINNED_STACK_ID、RECENTS_STACK_ID、ASSISTANT_STACK_ID
AMS和WMS中对Stack分别用ActivityStack和TaskTack描述,通过StackId来映射。对Task分别用TaskRecord、Task描述,通过TaskId来映射。
每个Activity显示在所属ActivityStack的bound区域内,多个Activity显示在各自ActivityStack的bound区域内,这样就可以实现多窗口。但是FreeForm模式下,Activity的bound由所属Task决定,而非Stack。多窗口不仅仅是控制Activity放入不同ActivityStack中,同时还要改变Activity的生命周期,即FocusActivity是resume状态,其他可见Activity是Pause状态,并不会进入Stop状态。
整个系统中只会有一个FocusStack,一个FocusActivity。用户在哪个Activity中操作,