背景
Android 13推出了一个大屏幕设备显现方案:Activity嵌入(Activity Embedding)。该功用不同于分屏方法(将多个运用一起显现在屏幕上),而是相似华为平行视界将同一个运用的多个不同Activity一起显现到屏幕上。
本文结合Android 13窗口架构,介绍Activity Embedding的创立流程。
窗口模型与Activity Embedding平行视界
Actiivty Embedding的完结流程与Android 13的窗口模型严密相关。最简略最笼统的状况下,窗口方针之间的关系如下:
简略来说,Activity所在的Task,是以DisplayArea的方法在整个层级中组织办理的。代表Activity节点的ActivityRecord作为Task的child来办理,Task则由TaskDisplayArea来办理。
用层级结构来看非常直观。下图为惯例状况(未进入Activity Embedding平行视界的状况)的层级描述:
简略解释一下这个层级,该Task位于一个DisplayArea,并以Activity栈的方法办理多个Activity,Activity办理WindowState。其间“V“图标含义是”可见“。
而进入平行视界的分屏方法时,两个Activity将一起显现,而Task自身不供给这个才能,而是由TaskFragment来完结。TaskFragment插入到Task和Activity之间,分割了Task在屏幕上的显现区域,供给给平行视界的两个Activity:
进入平行视界的层级,可见Task不再办理Actiivty栈,而被TaskFragment替代。
因此,TaskFragment是完结Activity Embedding平行视界的要害。进入平行视界实际上也便是创立TaskFragment并排布方位。
平行视界的一大特征是,Configuration有专属的WindowingMode、MaxBounds不等于Bounds。
Activity Embedding的两个Activity是独立制作的:
Activity Embedding平行视界的流程
Activity Embedding的运用层通过封装,运用相对简略,并且可以根据配置的分屏规则主动完结分屏。
其间要害的两个技术点,主动完结分屏、执行分配操作分别依靠Instrumentation.ActivityMonitor和android.window.ITaskFragmentOrganizerController这个Binder来完结。当新的Activity启动时,ActivityMonitor.onActivityStart()被回调,判别需求启动平行视界时,主动调用ITaskFragmentOrganizerController,完结主动进入分屏。
ITaskFragmentOrganizerController
进入Activity Embedding分屏的要害接口为ITaskFragmentOrganizerController.applyTransaction(),该接口在WindowManagerService中由WindowOrganizerController完结。
该方法主要处理Transaction,分为两大类类:Change、HierachyOps。关于平行视界的进入流程,为HierachyOps,简称为HOPs。
通过Transaction为左右两个Activity创立平行视界
创立平行视界的流程封装到了Transaction内,作为HOPs进行处理,保存到Transaction.hops(ArrayLists)内。
创立一个平行视界,实际上分为4步走:1. 创立左面Activity的TaskFragment,设置Configuration内的Bounds特点为左面的平行视界面积巨细,并添加到Task内;2. 将左面Activity添加到TaskFragment内;3. 重复第一步,只不过创立的是右边Activity的Fragment;4. 重复第2步,仅仅方针是右边的Activity。
对应到源码,分别为HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT、HIERARCHY_OP_TYPE_REPARENT_ACTIVITY_TO_TASK_FRAGMENT、HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT、HIERARCHY_OP_TYPE_SET_ADJACENT_TASK_FRAGMENTS。
创立的各个参数,要害点为initialBounds特点记录的Rect,它确定了TaskFragment的巨细和方位,终究确定了平行视界左右两个Activity的方位和巨细。
添加完结后,会依照惯例方法触发窗口的relayout和制作,将平行视界的内容显现到屏幕上。