Android分屏
从Android7.0开始支持分屏功能, 应用可以并排显示,也可以上下并排显示,本文基于Android14 展开分屏原理及应用适配相关介绍。
Android14 的分屏效果:
从上面效果来看,原生分屏的交互都已经比较友好,动画也很流畅,分屏经过多个大版本的迭代做了很多优化,包括:
- 代码结构上的解耦,使用WindowManager-Shell lib
- UI上的优化,比如拉动时显示遮罩
- 新功能添加,如分屏交换
- 分屏应用绘制和分屏UI同步显示
以上优化大家在做分屏项目的时候也可以借鉴,下面简单介绍下分屏设计框架。
应用适配
- 应用默认支持分屏,如果希望不支持可以在AndroidManifest.xml中设置:
android:resizeableActivity="false"
- 在Activity 中可以使用isInMultiWindowMode()接口判断是否在分屏状态。
- 应用可以在onConfigurationChanged中根据窗口大小去适配UI
分屏框架
-
WindowManager-Shell
WindowManager-Shell.aar 集成在SystemUI 中,分屏调度逻辑都在WindowManager-Shell中,以下是WindowManager-Shell中有关分屏的类关系图如下:
- SplitScreenController
提供外部分屏相关功能接口,如进入分屏startTasksWithLegacyTransition()
- StageCoordinator
分屏控制关键类,控制分屏状态包括大小、设置分屏windowmode、可见性等。管理MainStage、SideStage。
-
StageTaskListener
- SystemUI 中管理分屏栈类,通知WMS创建分屏栈,持有客户端分屏栈ActivityManager.RunningTaskInfo对象,监听WMS Task改变回调
-
MainStage、SideStage
继承StageTaskListener,分屏对应一个分屏栈
- SplitScreenTransitions
管理分屏动画
- SplitLayout
用于计算分屏区域大小
-
SplitWindowManager
- 管理分割栏窗口
-
DividerView
分割栏view
-
SyncTransactionQueue
- 用于管理分屏事务的发送,可以实现分屏事务的同步处理,通过WindowContainerTransactionCallback .onTransactionReady系统回调,统一控制分屏事务。
-
SystemUI 进程与系统交互
-
WMS
- 向WMS发送请求
- SystemUI 将分屏栈的信息如大小、位置、层级,通过发送wct(WindowContainerTransaction)到WMS,wct是窗口相关属性设置的集合,如果使用同步方式,SystemUI 会收到WMS回调,然后由SystemUI统一apply transaction,从而做到分屏应用界面的同步显示。
- 大致流程如下:
- 接收WMS回调
- 分屏栈创建时,也就是SystemUI 进程启动初始化阶段,会向WMS注册Callback 用于监听栈变化,相关binder接口ITaskOrganizerController
-
SurfaceFlinger
-
通过SurfaceControl.Transaction调整SurfaceFlinger中layer的属性
-
分屏的动画绘制是直接操作分屏栈RootTask 的SurfaceControl.Transaction对象,所以这里是直接与SurfaceFlinger 通信,不需要再通过system server了,使用binder ISurfaceComposer。
-
这篇文章简单介绍了实现分屏功能的主要模块,后面的分屏系列文章我们会详细介绍各个分屏流程的原理~
-