华为折叠屏适配方案:华为在大屏设备上有系统级别的支持方案,华为平行视界,能够支持折叠屏分屏显示
华为折叠屏分屏显示效果
Screenshot_20210527_160252_com.tencent.mm.jpg
华为平行视界简介
平行视界是一种在平板、折叠屏手机等大屏设备上对应用进行分屏展示的技术。平行视界以 Activity 为基本单位,以左右窗口分离显示技术、双窗口生命周期管理、双窗口显示模式和切换逻辑为核心技术实现的应用内分屏的系统侧解决方案。应用可以根据自身的业务特点,分屏显示不同的 Activity 组合,以实现符合应用逻辑的最佳单应用多窗口的用户体验。
平行视界入口
手机系统设置-应用-平行视界
支持平行视界的设备类型
华为折叠屏手机、华为平板M6系列及以上平板 (系统版本EMUI 10.X 及以上) 支持平行视界功能。
适配平行视界具体方法 (可脱离华为编译器实现的方案)
第一步,在 AndroidManifest.xml 文件中添加
<meta-data android:name="EasyGoClient" android:value="true" />
第二步,在 assets 目录下添加 easygo.json 配置文件
{
"easyGoVersion": "1.0",
"client": "应用包名",
"logicEntities": [
{
"head": {
"function": "magicwindow",
"required": "true"
},
"body": {
"mode": "1",
"activityPairs": [
{
"from": "MainActivity", // 触发分屏的源Activity,不支持通配符
"to": "*" // 触发分屏的目标Activity,支持通配符,“*”表示任意Activity
},
{
// 主页面Activity,可以有多个,分号隔开展开态时冷启动应用打开此页面时,系统在右屏自动启动relatedPage页面
"mainPage": "MainActivity",
// 右屏默认展示页面Activity,mainPages和relatedPage只能配置1对,需要具体的Activity名,不支持通配符
"relatedPage": "MagicWindowActivity"
}
],
"transActivities": [],
"UX": {
"isDraggable": "false", // true 为可以拖拽,false 为不可拖拽
"showStatusBar": "true" // 是否显示状态栏
}
}
}
]
}
只要简单的两步,就支持了平行视界,是不是非常的简单?
风险说明
- 只支持华为的部分设备,无法普及到一般的平板和折叠屏手机;
- 需要用户开启平行视界功能,才能使用;
- 目前仅支持二分屏幕的展示效果
- 目前只支持 Activity 为基本单位的分屏,不支持 Fragment 分屏显示,对于单 Activity 多 Fragment 的应用,想要支持平行视界,只能将 Fragment 改造成 Activity
FAQ
Q: 修改 easygo.json 配置文件后,为什么新配置未生效?
A: 修改 easygo.json 配置文件后,需要升级应用版本号或者卸载重新安装,新配置才能生效。
参考:https://developer.huawei.com/consumer/cn/forum/topic/0201144059651060174?fid=3467
Q: 如何判断设备是否为华为折叠屏?
A: 可根据手机系统属性 "ro.config.hw_fold_disp" 判断,该属性不为空则为华为折叠屏。
参考:https://developer.huawei.com/consumer/cn/forum/topic/0202567316824870264?fid=3467
Q: 如何判断设备是否支持平行视界?
A: 可根据手机系统属性 "ro.config.hw_magic_window_enable", 改属性为 "true" 则支持华为平行视界。
参考:https://developer.huawei.com/consumer/cn/forum/topic/0202567316824870264?fid=3467
Q: 能否将应用配置为默认开启平行视界?
A: 不能,部分头部应用能默认开启平行视界是因为跟华为签了协议,华为将这些应用添加进白名单。
参考:https://developer.huawei.com/consumer/cn/forum/topic/0204412700180730409?fid=3467
Q: 如何判断应用在平行视界下运行?
A: 可用如下代码判断
private fun isInMagicWindow(): Boolean {
val ctx = context ?: return false
val configuration = ctx.resources.configuration.toString()
return configuration.contains("hwMultiwindow-magic") || configuration.contains("hw-magic-windows")
}
参考:https://developer.huawei.com/consumer/cn/forum/topic/0201296861975670023?fid=3467
网友评论