重学分屏:aosp13/14/15/16中SplitScreen相关类总结

背景:

在学习马哥分屏自由窗口pip相关实战课时候,有针对整个源码都进行详细的分析和实战修改。但是分屏这块涉及的相关类比较多,时间一久对这分屏相关的这些类可能就容易记不清楚,所以本文专门针对分屏相关的一些核心类进行统一的整理,方便大家可以进行相关回忆分屏这块知识。

同时近期也刚好在做三分屏相关的实战项目,也需要这块的知识,先给大家秀一下三分屏相关的一些实战成果:
在这里插入图片描述

整体结构流图

这里针对分屏这块的剖析流图如下:

SplitScreenController (对外交互总指挥官)
        |
StageCoordinator (中央协调员 & 调度员)
        |                           \
    MainStage                    SideStage
    (extends StageTaskListener)    (extends StageTaskListener)
        |                             |
    “持有主屏Task集合”           “持有侧屏Task集合”
         

对应的层级结构图如下:
在这里插入图片描述

SplitScreenController

/**
 * Class manages split-screen multitasking mode and implements the main interface
 * {@link SplitScreen}.
 *
 * @see StageCoordinator
 */
// TODO(b/198577848): Implement split screen flicker test to consolidate CUJ of split screen.
public class SplitScreenController implements SplitDragPolicy.Starter,
        RemoteCallable<SplitScreenController>, KeyguardChangeListener {
    private static final String TAG = SplitScreenController.class.getSimpleName();

作用:分屏功能的入口点和总控制器

StageCoordinator

/**
 * Coordinates the staging (visibility, sizing, ...) of the split-screen stages.
 * Some high-level rules:
 * - The {@link StageCoordinator} is only considered active if the other stages contain at
 * least one child task.
 * - The {@link SplitLayout} divider is only visible if multiple {@link StageTaskListener}s are
 * visible
 * - Both stages are put under a single-top root task.
 */
public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        DisplayController.OnDisplaysChangedListener, Transitions.TransitionHandler,
        ShellTaskOrganizer.TaskListener, StageTaskListener.StageListenerCallbacks,
        SplitMultiDisplayProvider {

作用:分屏阶段协调器,核心业务逻辑中心
管理MainStage和SideStage的协同工作
处理任务分配和阶段切换
监听并响应StageTaskListener的事件
控制SplitLayout的更新

MainStage

/**
 * Main stage for split-screen mode. When split-screen is active all standard activity types launch
 * on the main stage, except for task that are explicitly pinned to the {@link SideStage}.
 * @see StageCoordinator
 */
class MainStage extends StageTaskListener {

管理主屏任务的Activity栈

SideStage

/**
 * Side stage for split-screen mode. Only tasks that are explicitly pinned to this stage show up
 * here. All other task are launch in the {@link MainStage}.
 *
 * @see StageCoordinator
 */
class SideStage extends StageTaskListener {

管理侧屏任务的Activity栈

StageTaskListener

/**
 * Base class that handle common task org. related for split-screen stages.
 * Note that this class and its sub-class do not directly perform hierarchy operations.
 * They only serve to hold a collection of tasks and provide APIs like
 * {@link #addTask(ActivityManager.RunningTaskInfo, WindowContainerTransaction)} for the centralized
 * {@link StageCoordinator} to perform hierarchy operations in-sync with other containers.
 *
 * @see StageCoordinator
 */
class StageTaskListener implements ShellTaskOrganizer.TaskListener {

SideStage和MainStage的基类,主要公共处理一些和分屏相关的task提议操作,但是一定不会直接操作操作task层级,这些操作层级都是在集中在StageCoordinator进行同步操作,监听任务变化并维护任务集合。

应用层
    ↓
SplitScreenController  ← 用户交互入口
    ↓
StageCoordinator       ← 中央协调器
    ├── MainStage      ← 只持有任务+提议操作
    ├── SideStage      ← 只持有任务+提议操作
    └── SplitLayout    ← 只计算布局
        ↓
WindowContainerTransaction  ← 操作记录
        ↓
ShellTaskOrganizer          ← 实际执行
        ↓
WindowManagerService        ← 系统层

SplitDecorManager

/**
 * Handles additional layers over a running task in a split pair, for example showing a veil with an
 * app icon when the task is being resized (usually to hide weird layouts while the app is being
 * stretched). One SplitDecorManager is initialized on each window.
 * <br>
 * Currently, we show a veil when:
 *  a) Task is resizing down from a fullscreen window.
 *  b) Task is being stretched past its original bounds.
 * <br>
 *                       Split root
 *                    /      |       \
 *         Stage root      Divider      Stage root
 *           /   \
 *      Task       *this class*
 *
 */
public class SplitDecorManager extends WindowlessWindowManager {

处理分屏装饰部分,比如正在被resizing的分屏task需要显示对应的遮盖logo

SplitLayout

/**
 * Records and handles layout of splits. Helps to calculate proper bounds when configuration or
 * divider position changes.
 */
public final class SplitLayout implements DisplayInsetsController.OnInsetsChangedListener {

主要分屏布局计算器
计算两个分屏区域的矩形边界
管理分隔线位置和拖动范围
处理不同方向(水平/垂直)的布局
响应显示旋转和配置变更

SplitWindowManager

/**
 * Holds view hierarchy of a root surface and helps to inflate {@link DividerView} for a split.
 */
public final class SplitWindowManager extends WindowlessWindowManager {

主要是帮转DividerView创建对应无窗口SurfaceControl,让DividerView可以在系统中显示的载体

DividerView

/**
 * Divider for multi window splits.
 */
public class DividerView extends FrameLayout implements View.OnTouchListener {

分隔条视图组件
显示和响应用户拖动手势

发送拖动事件到SplitLayout

总结图:

在这里插入图片描述原文地址:
https://mp.weixin.qq.com/s/2DRuIH-OKgTVU9AoIerjvA

更多framework实战开发干货,请关注下面“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值