背景:
在学习马哥分屏自由窗口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实战开发干货,请关注下面“千里马学框架”

287

被折叠的 条评论
为什么被折叠?



