国内手机厂商的折叠屏适配要求,大屏 App 的新规范
国内手机厂商的折叠屏适配要求,大屏 App 的新规范
去年几家大厂凑在一起搞了个折叠屏软件生态联盟,华为、小米、OPPO、vivo、荣耀,该在的都在。新闻稿写得挺漂亮,说要统一标准、共建生态、提升大屏体验。结果联盟成立快一年了,我打开各家应用商店的开发者后台,看到的依然是五套不同的适配文档、五种相互矛盾的检测规则、以及无穷无尽的驳回通知。所谓生态联盟,更像是一个让各厂商名正言顺向开发者提要求的联合署名平台,实际干活的时候,该重启的 Activity 照样重启,该返回错误屏幕参数的 ROM 一个都没修。
联盟成立了,标准却裂得更碎
折叠屏手机这几年出货量确实在涨,华为 Mate X5、小米 MIX Fold 4、OPPO Find N3、vivo X Fold3 Pro、荣耀 Magic V3,各家旗舰折叠屏的硬件完成度已经很高了。但软件层面,尤其是第三方 App 的大屏体验,基本还是一团糟。更麻烦的是,这团糟不是开发者不愿意适配,而是不知道该按谁的标准来适配。
华为有自己的《折叠屏应用开发指导》,核心逻辑围绕"平行视界"展开,要求开发者按照特定方式组织 Activity 层级,系统会在 AMS 层面把同一个 App 的两个 Activity 左右并排。小米发布过《大屏设备适配白皮书》,强调的是 resizeableActivity 和多窗口兼容性。OPPO 和 vivo 则分别有自己的大屏设计规范和折叠屏检测接口。这些文档单独看都有道理,但放在一起就是灾难。比如华为建议在某些场景下通过 android:configChanges 阻止 Activity 重建以维持平行视界的状态,而小米的部分系统版本在检测到 configChanges 声明后,分屏逻辑会走另一条分支,导致窗口比例计算异常。你在华为上调好的双栏布局,放到小米 MIX Fold 上可能就出现状态栏重叠或者底部导航栏被吞掉。
这种分裂的根子在于,各家厂商的折叠屏软件方案大量依赖私有 ROM 修改,而不是 Google 在 Android 12L 和 Android 13 里推的大屏标准化 API。Android 12L 专门为大屏幕和可折叠设备做了优化,引入了 Activity Embedding、多窗口模式的改进、以及更完善的兼容性框架。但国内厂商的动作比 Google 快得多,早在 Android 10、Android 11 时代,华为和三星就已经在搞自己的分屏和多窗口方案了。等到 Google 的标准化方案姗姗来迟,各家的私有生态已经固化,用户也养成了使用习惯。现在所谓的"联盟",本质上是在已经分裂的地盘上画一条虚线,告诉大家"我们原则上同意统一",但代码里该 hook 的 Activity 生命周期照样 hook,该私有化的接口一个都不放。
Activity 重启与 configChanges 的泥潭
做过折叠屏适配的开发者,大概率都被 Activity 重建问题折磨过。折叠屏从外屏展开到内屏,或者从内屏合拢到外屏,Configuration 会发生剧烈变化:screenSize、smallestScreenSize、screenLayout、orientation、density 都会变。按照 Android 标准行为,如果不在 AndroidManifest.xml 里显式声明 configChanges,系统会销毁并重建 Activity。这对于一个正在播放视频、或者用户填了一半表单的页面来说,体验是毁灭性的。
所以标准做法是声明 `android:configChanges="orientation
在华为的部分折叠屏机型上,即使你完整声明了上述 configChanges,系统在某些场景下仍然会强制重建 Activity。比如在平行视界模式下,如果用户把应用从 half-opened 状态完全展开,AMS 会重新计算 Activity 的启动模式和 task 栈,触发一次无视 configChanges 的重建。这不是我瞎说,华为开发者论坛上有不少工单提到这个问题,官方给出的方案是用 ViewModel 保存状态,或者通过 `onSave