一、背景
安卓⼤屏设备上由于屏幕尺⼨特殊,存在应⽤显示异常和体验不佳等问题。为了保证三⽅应⽤在⼤屏设备的使⽤体验,针对⼤屏特性,OPPO系统提供兼容模式、平⾏视窗等多种⽅案,使得三⽅App能在⼤屏设备有更好的交互体验与显示效果。以下文档是平行视窗适配指南。
二、配置指南
(1)AndroidManifest文件
<meta-data android:name="EasyGoClient" android:value="true"/>
(2)app目录下assets文件夹新增easygo.json文件
三、easygo.json文件解析
参数 | 类型 | 描述 |
---|---|---|
easyGoVersion | String | 协议版本,固定值为“1.0” |
client | String | 应用包名 |
logicEntities. head.function | String | 调用组件名,固定值“magicwindow” |
logicEntities. head.required | String | 预留字段,固定值“true” |
logicEntities.body.mode | String | 基础分屏模式0:购物模式,activityPairs节点不生效1:自定义模式(包括导航栏模式) |
logicEntities.body.activityPairs | 数组对象 | 自定义模式参数,配置从from页面到to页面的分屏展示 |
logicEntities.body.activityPairs.from | String | 触发分屏的源Activity |
logicEntities.body.activityPairs.to | String | 触发分屏的目标Activity,“ * ”表示任意Activity 自定义模式:[{”from”:”com.xxx.ActivityA”,“to”:”com.xxx.ActivityB”}] 表示A上启动B,触发分屏(A 左B右) 导航栏模式:[{”from” :” com.xxx. ActivityA”, “to” :” * ”}] |
logicEntities.body.defaultDualActivities | 数组对象 | 应用冷启动默认打开首页双屏配置 |
logicEntities.body.defaultDualActivities.mainPages | String | 主页面Activity,可以有多个,分号隔开展开态时冷启动应用打开此页面时,系统在右屏自动启动relatedPage页面 |
logicEntities.body.defaultDualActivities.relatedPage | String | 右屏默认展示页面Activity mainPages和relatedPage只能配置1对,需要具体的Activity名,不支持通配符 如: [{“mainPages”:“com.xxx.MainActivity”,“relat edPage”:“com.xxx.EmptyActivity”}] |
logicEntities.body.transActivities | String数组 | 过渡页面列表 如 [“com.xxx.ActivityD”,“com.xxx.ActivityE”,“com.xxx.ActivityF”] |
logicEntities.body.Activities | 数组对象 | 应用关键Activity属性列表 |
logicEntities.body.Activities.name | String | Activity组件名 |
logicEntities.body.Activities.defaultFullScreen | String | Activity是否支持默认以全屏启动 true:支持 false:不支持 默认为false |
logicEntities.body.Activities.lockSide | String | Activity锁定方式,当前仅支持锁定在primary侧 primary:锁定在主界面那一侧,锁定后,另一 侧启动新的Activity时不会轻易平推窗口过来, 除非推过来的窗口也是primary锁定窗口(典型 场景:直播购物场景,将直播Activity配置成锁 定)。 |
logicEntities.body.UX | 对象 | 页面UX控制配置 |
logicEntities.body.UX.supportVideoFullscreens | String | 是否支持视频全屏 true:支持 false:不支持 |
logicEntities.body.UX.supportDraggingToFullScreen | String | 默认开启全屏 |
四、使用(Demo形式展示)
activity栈分析(无源码,纯个人现象级分析,有一定的偏差):总的来说,分屏模式适用于系统原生的activity栈结构。对于当前应用来讲,启动分屏后,左右分屏共用当前处于应用栈顶的栈,在这个栈中,有两个子栈,分别分配给左屏和右屏。左屏处于左子栈栈顶,并永远只有单实例,也就是“mainPages”属性的activity;右屏处于右子栈栈顶,也就是“relatedPage”属性的activity。
1.左屏:启动activity(标准模式)后,未设置关键activity属性时,默认会压入右子栈栈顶,“relatedPage”属性的activity会压入栈中,不是“relatedPage”的activity实例,会根据启动的activity的“lockSide”设置的属性,有不同的现象,这里暂不做分析。如果设置关键activity属性后,即“defaultFullScreen”设置为“true”,会将当前activity应用的栈顶的栈,也就是左右屏处于的栈压入栈中,目标activity处于栈顶。
2.右屏:启动activity(标准模式),和左屏启动现象一致,只会对右子栈做改动。
3.大屏切小屏:根据当前现象来讲,大屏切小屏过后,左右子栈实例会合并,左子栈的单实例会处于当前应用栈的栈底。
(1)基础分屏模式
配置(logicEntities.body.defaultDualActivities)参数即可在应用冷启动过后开启分屏。基础分屏模式有以下属性(初始状态:大屏,activity启动模式:标准模式):
"mode":"0"
"defaultDualActivities": {
//左屏
"mainPages": "com.example.recycledelegate.MainActivity",
//右屏
"relatedPage": "com.example.recycledelegate.NewPageActivity"
}
-
未做任何跳转逻辑操作时,如果大屏切换小屏,小屏则展示左屏页面。
-
左屏跳转目标activity时,未对目标activity在“Activities”参数的“defaultFullScreen”属性
设置true,并且跳转intent未设置FLAG_ACTIVITY_CLEAR_TASK标志位,则目标activity展示在右屏内。并且大屏切换小屏后,小屏展示目标activity,也就是展示左屏页面。
3.基础分屏模式下不能应用内关闭分屏(除非用户关闭平行视窗功能)。通常冷启动的“mainPages”是首页,而通过以上分析知道左右屏公用一个栈,所以会一直存在当前应用进程,直到应用进程销毁。
(2)自定义分屏模式
自定义分屏模式和基础分屏模式不同,它可以应用冷启动开启分屏,也可以应用内启动目标activity开启分屏,以下将分别分析它们之间的异同处。
1.冷启动开启分屏:
"mode":"1",
"defaultDualActivities": {
//左屏
"mainPages": "com.example.recycledelegate.MainActivity",
//右屏
"relatedPage": "com.example.recycledelegate.NewPageActivity"
},
和基础分屏模式的冷启动没有实质性区别。
2.应用内启动目标activity开启分屏:
mode": "1",
"activityPairs": [
{
//左屏
"from": "com.example.recycledelegate.MainActivity",
// 右屏
"to": "com.example.recycledelegate.NewPageActivity"
}
],
启动目标activity后,会和基础分屏模式一样,会在当前栈顶的栈开辟两个子栈,左子栈为“from”属性的activity,右子栈为”to“属性的activity。大屏且小屏后,小屏会展示右屏内容。
左屏:左屏activity 实例(单)finish()时,会销毁当前应用栈顶,应用显示栈中某个栈实例,如果当前应用栈是单实例,则结束当前应用进程。
右屏:右屏activity实例finish()时,如果右子栈中是单实例,finish()时,会关闭分屏模式,并显示左屏的大屏。