Split Screen — 是一种分屏模式,允许同时并排运行两个应用程序,共享可用空间。用户可以在窗口之间拖动分隔线、更改比例并快速切换每一半中的应用。根据 Android Developers (2025),Split Screen 是屏幕宽度从 600 dp 起的所有设备的强制兼容性计划的一部分,并且同时支持 Android 和 iPadOS。
要点
Split Screen — 是一种多任务模式,屏幕被分成两个功能区域,每个区域包含一个独立的应用程序。与 Slide Over 或 PiP(一个窗口浮动在另一个之上)不同,Split Screen 给予两个应用程序同等的地位——每个应用程序获得自己的一半屏幕。
该模式可在 Android(从 7.0 Nougat 开始)、iPadOS(从 iOS 9 开始)、Windows(Snap Assist)和一些 Linux 桌面环境中使用。在移动开发中,Split Screen 被认为是平板电脑和折叠设备的强制场景,多任务处理是平台的关键优势。
用户通过长按 Overview 中的应用程序图标(Android)或从 Dock 拖动(iPad)来激活 Split Screen。激活后,屏幕被分割,用户从最近列表或 Dock 中选择第二个应用程序。
在 Android 中,Split Screen 通过 Window Manager 进行管理。当用户激活该模式时,系统会创建两个 StackView——每个 Activity 一个。窗口之间的分隔线由系统绘制,其最小厚度为 1 dp,但在具有 手势导航 的设备上可以增加。
每个应用程序通过 onConfigurationChanged 接收大小更改通知。如果 Activity 不处理此事件——它将被销毁并重新创建。对于视频和游戏来说,这很关键:重新创建 Activity 会重置播放位置或游戏状态。
窗口比例可以通过拖动分隔线来更改。Android 支持三种状态:50/50、70/30 和 30/70。用户还可以交换应用程序——如果不处理 configChanges,这将导致 Activity 重启。
Split View — 是 iPadOS 中 Split Screen 的实现。与 Android(屏幕总是从中心分割)不同,iPadOS 为用户提供了三种分隔线位置:50/50、25/75 和 75/25。该模式通过 Dock 或 App Exposé 激活。
在 iPadOS 中,Split View 中的应用程序可以最小化为 Slide Over——一个浮动窗口。这是 Apple 的独特功能:用户可以将其中一个窗口从 Split View 转换为 Slide Over,再转换回来,而不会丢失数据。开发人员必须支持所有三种模式:全屏、Split View 和 Slide Over。
为了在 iOS 中支持 Split View,应用程序必须通过 Size Classes 和场景(UIScene)实现自适应布局。从 iOS 13 开始,Apple 要求应用程序正确处理多窗口模式——否则,系统可能会强制重启 iPad 上的 Activity。
在进入和退出 Split Screen 时,会发生配置变更:窗口的宽度、高度和宽高比会改变。Android 的标准行为——重新创建 Activity(onDestroy + onCreate)。为避免这种情况,请在清单中指定 android:configChanges。
重新创建 Activity 时会丢失 View 和 ViewModel 状态。使用 SavedStateHandle 保存 UI 状态或具有 Application 范围的 ViewModel。替代方案——onRetainNonConfigurationInstance() 用于复杂对象。
@Override
fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
val isSplitScreen = isInMultiWindowMode()
if (isSplitScreen) {
adjustLayoutForSplitScreen()
}
}
在 iPadOS 中,类似的机制——traitCollectionDidChange 或 viewWillTransitionToSize。开发人员接收新的容器大小,必须根据 Size Class 重新构建布局。
在 Android 中,对 Split Screen 的支持始于在清单中设置 resizeableActivity 标志。之后,Activity 可以缩小到最小宽度 220 dp。如果应用程序不支持如此窄的屏幕——请在清单中指定 android:minWidth。
对于 iPad,开发人员只需支持 Size Classes 并使用 Auto Layout 或 SwiftUI。SwiftUI 在切换到 Split View 时会自动调整界面——例如,NavigationSplitView 在 stacked 和 side-by-side 模式之间切换。
建议在真实设备上或具有 multi-resizable window 设置的模拟器中测试 Split Screen。Android Emulator 允许通过 ADB 启动任意数量的窗口,并检查应用程序在不同比例下的行为。
| 平台 | 适配机制 | 最小宽度 |
|---|---|---|
| Android | resizeableActivity + configChanges | 220 dp |
| iPadOS | Size Classes + UIScene | 320 pt (primary) |
第一个错误——忽略状态保存。在 Split Screen 中,Activity 可能随时在用户不干预的情况下被重新创建。如果数据只存储在局部变量中——它们将丢失。对屏幕数据使用 ViewModel,对关键状态使用 SavedStateHandle。
第二个错误——在窗口缩小时隐藏内容。一些开发者在宽度低于某个阈值时隐藏元素。正确的方法是——重新构建布局:在窄屏上只显示最重要的内容,而不是隐藏所有内容。Window Size Class 为此逻辑提供了现成的断点。
第三个错误——不处理 onWindowFocusChanged。在 Split Screen 中,焦点可以在不关闭应用程序的情况下在窗口之间切换。忽略此事件会导致视频播放器在用户只是看向相邻窗口时停止。
常见问题解答
使用带有 FLAG_ACTIVITY_LAUNCH_ADJACENT 的 Intent。如果设备处于 Split Screen 模式,应用程序将在相邻窗口中打开。如果设备处于全屏模式——标志被忽略。
是的。Activity 保持可见但失去焦点——调用 onPause,但不调用 onStop。退出 Split Screen 时会调用 onMultiWindowModeChanged,然后是 onResume。
使用 WindowManager.getCurrentWindowMetrics() 或 Jetpack WindowManager。不要使用 Display.getSize()——它返回整个屏幕,而不是应用程序的当前窗口。
是的。在展开的设备上,Split Screen 通常是默认模式。Samsung Galaxy Z Fold 在横屏模式下提供同时显示三个应用的 Split Screen。
为该 Activity 设置 android:resizeableActivity="false"。对于 API 24+,该标志禁止 Split Screen。在 Android 12L+ 上使用 android:minWidth 和 android:minHeight。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。