平行视界
简介
平行视界,一种针对折叠屏设备和平板设备的特殊显示模式,支持同一应用的多个Activity通过左右分屏形式同时在屏幕上展示。
显示模式
平行视界提供三种双屏窗口显示模式,最大程度地满足了不同应用场景下用户的需求。
-
购物模式:屏幕会显示最新点击的窗口,左边为次新,右边为最新。适用于购物类软件。
-
任意场景,从左分屏打开的新页面,都会将右分屏的页面替换掉。
-
从右分屏打开新页面,原右分屏页面向左移,新页面在右分屏打开。
-
从左分屏触发Back,右分屏的Activity会被销毁,左分屏栈顶Activity会被销毁。
-

-
导航栏模式:左侧窗口始终保持应用主界面,右边窗口实时显示左边点击的内容。
关键配置项为:
- logicEntities.body.mode值配置为1。
- activityPairs 配置策略:"From X to *"。其中X为" 应用主界面 "。
-
自定义模式:在这个模式下开发者可以根据业务场景对窗口显示模式进行自定义。
-
在全屏模式下,满足activityPairs关系的Activity触发分屏。
-
在已经分屏的情况下,触发了新的Activity,如果该Activity不命中activityPairs关系,则新Activity在右分屏显示,不论是在哪个分屏触发。
// 当从 Android 跳转到Main2AbilityActivity 时由于未命中activityPairs关系 // 因最终的显示结果是:Main2AbilityActivity 将显示右侧分屏。 "activityPairs": [ { "from": "com.example.basicapplication.AndroidMainActivity", "to": "com.example.basicapplication.EntryMain1AbilityActivity" }, //{ // "from": "com.example.basicapplication.AndroidMainActivity", // "to": "com.example.basicapplication.EntryMain2AbilityActivity" //}, ], -
在已经分屏的情况下,触发了新的Activity,如果该Activity命中activityPairs关系,从左分屏打开的新页面,会将右分屏的页面替换掉;从右分屏打开新页面,原右分屏页面向左移,新页面在右分屏打开。
// 当由 AndroidMainActivity 跳转到 EntryMain1AbilityActivity 时,命中activityPairs关系, // 所以最终的显示效果中:左分屏内容为 AndroidMainActivity;右分屏内容为 EntryMain1AbilityActivity。 "activityPairs": [ { "from": "com.example.basicapplication.AndroidMainActivity", "to": "com.example.basicapplication.EntryMain1AbilityActivity" }, //{ // "from": "com.example.basicapplication.AndroidMainActivity", // "to": "com.example.basicapplication.EntryMain2AbilityActivity" //}, ], -
从左分屏触发Back,右分屏的所有Activity会被销毁,左分屏栈顶Activity会被销毁。
-
典型场景
-
典型场景一:列表+浏览
-
典型场景二:详情+客服
-
典型场景三:商品对比
-
典型场景四:列表+聊天
适用平台
- 仅支持Android平台。
- 仅支持折叠屏设备和平板设备,其中部分属性功能仅支持平板设备。
- 要求设备本身系统能力支持"平行视界"功能,不同手机厂家针对该功能的文本描述和系统设置方式略有不同,请以实际真机配置为准。
配置指南
(一)、修改AndroidManifest文件
在 " AndroidManifest.xml " 文件的 " application " 中新增字段 " meta-data ":
<meta-data android:name="EasyGoClient" android:value="true" />

(二)、新增easygo.json配置文件
在 " assets " 目录下新建配置文件 " easygo.json "
{
"easyGoVersion": "1.0",
"client": "com.example.basicapplication",
"logicEntities": [
{
"head": {
"function": "magicwindow",
"required": "true"
},
"body": {
"mode": "1",
"defaultDualActivities": {
"mainPages": "com.example.basicapplication.Main1Activity",
"relatedPage": "com.example.basicapplication.A0Activity"
},
"transActivities": [
"com.example.basicapplication.A1Activity",
"com.example.basicapplication.A2Activity"
],
"Activities": [
{
"name": "com.example.basicapplication.AFullScreenActivity",
"defaultFullScreen": "true"
},
{
"name": "com.example.basicapplication.BFullScreenActivity",
"lockSide": "primary"
}
],
"UX": {
"supportRotationUxCompat": "false",
"isDraggable": "false"
}
}
}
]
}
" easygo.json " 文件模板以及字段详细说明:
- 其中关于配置个数的说明:
- "?":说明可以设置值为"0"(不设置值)或 "1"(设置1个值)
- "*":说明可以设置多个数值
| 参数 | 描述 | 是否必填 | 限制 | 取值的范例 仅作参考 |
|---|---|---|---|---|
| easyGoVersion | 协议版本 | 必填 | 1 | "1.0" |
| client | Android应用包名 | 必填 | 1 | "com.example.basicapplication" |
| logicEntities. head. function | 调用组件名,固定值"magicwindow" | 必填 | 1 | "magicwindow" |
| logicEntities. head. required | 预留字段,固定值"true" | 必填 | 1 | "true" |
| logicEntities.body.mode | 基础分屏模式 0:购物模式(activityPairs节点不生效) 1:自定义模式(包括导航栏模式) |
必填 | 1 | "0" |
| logicEntities.body. activityPairs | 自定义模式参数,配置从from页面到to页面的分屏展示 | 选填 | ? | 表示A上启动B,触发分屏(A左B右) [{"from" :"com.xxx. ActivityA", "to" :"com.xxx. ActivityB"}] 导航栏模式 [{"from" :"com.xxx. ActivityA", "to" :"*"}] |
| logicEntities.body. activityPairs.from | 触发分屏的源Activity | 选填 | * | "com.example.basicapplication.ActivityA" |
| logicEntities.body. activityPairs.to | 触发分屏的目标Activity "*"表示任意Activity |
选填 | * | "com.example.basicapplication.ActivityB" |
| logicEntities.body. defaultDualActivities | 应用冷启动默认打开首页双屏配置 | 选填 | ? | [{"mainPages":"com.example.basicapplication.ActivityA","relatedPage":"com.example.basicapplication.ActivityB"}] |
| logicEntities.body. defaultDualActivities.mainPages | 主页面Activity,需要具体的Activity名,不支持通配符。展开态时冷启动应用打开此页面时,系统在右屏自动启动relatedPage页面 | 选填 | 1 | "com.example.basicapplication.ActivityA" |
| logicEntities.body.defaultDualActivities.relatedPage | 右屏默认展示页面Activity,需要具体的Activity名,不支持通配符 | 选填 | 1 | "com.example.basicapplication.ActivityB" |
| logicEntities.body.transActivities | 过渡页面列表 | 选填 | * | ["com.example.basicapplication.ActivityA","com.example.basicapplication.ActivityB","com.example.basicapplication.ActivityC"] |
| logicEntities.body.Activities | 应用关键Activity属性列表 | 选填 | ? | |
| logicEntities.body.Activities.name | Activity组件名 | 选填 | 1 | "com.example.splitscreenview.EntryFeature1AbilityActivity", |
| logicEntities.body.Activities.defaultFullScreen | Activity是否支持默认以全屏启动 默认值为false true:支持 false:不支持 |
选填 | ? | "true" |
| logicEntities.body.Activities.lockSide | Activity锁定方式,当前仅支持 'primary' primary:锁定在主界面那一侧,锁定后,另一侧启动新的Activity时不会轻易平推窗口过来,除非推过来的窗口也是primary锁定窗口 |
选填 | ? | "primary" |
| logicEntities.body.Activities.isSupportDraggingToFreeform | 当前Activity是否支持拖出到悬浮窗,当logicEntities.body.UX.draggingToFreeForm配置为window时生效 默认值为false true:支持 false:不支持 |
选填 | ? | "true" |
| logicEntities.body.UX | 页面UX控制配置 | 选填 | ? | |
| logicEntities.body.UX.supportRotationUxCompat | 是否开启窗口缩放,仅针对平板设备生效 默认值为false true:支持 false:不支持 |
选填 | ? | "true" |
| logicEntities.body.UX.isDraggable | 是否支持分屏窗口拖动,仅针对平板设备生效 默认值为false true:支持 false:不支持 |
选填 | ? | "true" |
| logicEntities.body.UX.supportLock | 是否支持应用内用户锁定功能,配置为true后,双窗口显示状态会显示锁定按钮,用户点击后可以进行锁定和解锁操作,锁定后,左右窗口不再关联,即左侧打开新窗口在左侧显示,右侧打开新窗口在右侧显示。 默认值为false true:支持锁定 false:不支持 |
选填 | ? | "true" |
| logicEntities.body.UX.draggingToFreeForm | 是否支持应用内Activity拖出到悬浮窗。 app:应用内所有Activity均支持拖出到悬浮窗 window:只有在logicEntities.body.Activities中配置了isSupportDraggingToFreeform为true的Activity才支持拖出到悬浮窗 off:关闭应用的拖出到悬浮窗功能 |
选填 | ? | "window" |
FAQ
-
如何验证配置是否生效?
目前仅支持真机上进行测试。
-
配置好了如果不生效如何排查?
- 排查"easygo.json"配置文件的格式和内容是否正确,能否正确解析,路径是否正确。
- client参数的配置是否正确,确认是Android应用的包名。
- 真机系统设置菜单中该应用的平行视界开关是否开启。
- 折叠屏是设备竖屏方向生效,平板是设备横屏方向生效。
- 真机系统系统版本是否升级到最新的版本。
-
配置Activity A B的跳转关系对(activityPairs)时,能在A页面触发打开A页面的新实例同时分屏显示吗?
可以,配置from A to A即可。
-
除了支持1:1的比例分屏,还支持其它的比例分屏吗?
目前只支持1:1的比例分屏。
-
应用能感知当前Activity是在左分屏还是右分屏吗?
目前三方应用无法感知。
-
支持多少跳转关系对(activityPairs)的配置?
目前对于整个配置文件的建议是不大于500KB,对于具体配置条目个数没有限制。
-
配置Activity A B的跳转关系对(activityPairs)时,如果即希望A打开B能分屏,也希望B打开A能分屏,配置一条关系可以吗?
在easygo.json中activityPairs配置中区分from和to,如果相互打开都能触发分屏,需要配置两条,分别是from A to B和from B to A。