OPPO折叠屏平行视窗适配指南

一、背景

安卓⼤屏设备上由于屏幕尺⼨特殊,存在应⽤显示异常和体验不佳等问题。为了保证三⽅应⽤在⼤屏设备的使⽤体验,针对⼤屏特性,OPPO系统提供兼容模式、平⾏视窗等多种⽅案,使得三⽅App能在⼤屏设备有更好的交互体验与显示效果。以下文档是平行视窗适配指南。

二、配置指南

(1)AndroidManifest文件
  <meta-data android:name="EasyGoClient" android:value="true"/>
(2)app目录下assets文件夹新增easygo.json文件

三、easygo.json文件解析

参数类型描述
easyGoVersionString协议版本,固定值为“1.0”
clientString应用包名
logicEntities. head.functionString调用组件名,固定值“magicwindow”
logicEntities. head.requiredString预留字段,固定值“true”
logicEntities.body.modeString基础分屏模式0:购物模式,activityPairs节点不生效1:自定义模式(包括导航栏模式)
logicEntities.body.activityPairs数组对象自定义模式参数,配置从from页面到to页面的分屏展示
logicEntities.body.activityPairs.fromString触发分屏的源Activity
logicEntities.body.activityPairs.toString触发分屏的目标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.mainPagesString主页面Activity,可以有多个,分号隔开展开态时冷启动应用打开此页面时,系统在右屏自动启动relatedPage页面
logicEntities.body.defaultDualActivities.relatedPageString右屏默认展示页面Activity
mainPages和relatedPage只能配置1对,需要具体的Activity名,不支持通配符
如:
[{“mainPages”:“com.xxx.MainActivity”,“relat edPage”:“com.xxx.EmptyActivity”}]
logicEntities.body.transActivitiesString数组过渡页面列表

[“com.xxx.ActivityD”,“com.xxx.ActivityE”,“com.xxx.ActivityF”]
logicEntities.body.Activities数组对象应用关键Activity属性列表
logicEntities.body.Activities.nameStringActivity组件名
logicEntities.body.Activities.defaultFullScreenStringActivity是否支持默认以全屏启动
true:支持
false:不支持
默认为false
logicEntities.body.Activities.lockSideStringActivity锁定方式,当前仅支持锁定在primary侧
primary:锁定在主界面那一侧,锁定后,另一 侧启动新的Activity时不会轻易平推窗口过来, 除非推过来的窗口也是primary锁定窗口(典型 场景:直播购物场景,将直播Activity配置成锁 定)。
logicEntities.body.UX对象页面UX控制配置
logicEntities.body.UX.supportVideoFullscreensString是否支持视频全屏
true:支持
false:不支持
logicEntities.body.UX.supportDraggingToFullScreenString默认开启全屏

四、使用(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"
        }      
  1. 未做任何跳转逻辑操作时,如果大屏切换小屏,小屏则展示左屏页面。

  2. 左屏跳转目标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()时,会关闭分屏模式,并显示左屏的大屏。

五、注意事项

(1)自定义模式启动目标分屏Actiivty时,FLAG_ACTIVITY_CLEAR_TASK标志位不能使用,否则会导致分屏无效。(启动目标activity时,尽量避免带有特殊属性的启动。)
(2)”transActivities“参数暂时没有发现有何作用,慎用。
(3)”mainPages“和”relatedPage“有且只有一对。
(4)”lockSide“属性可以使右屏存储多实例,即开启购物模式。
(5)启动目标activity时,注意目标activity的启动模式,对分屏模式有一定的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值