Multi-Window — 是Android中的一组多任务处理模式,允许在屏幕上同时运行多个应用程序。系统包括三种模式:Split Screen用于将屏幕分成两部分,Picture-in-Picture用于在小窗口中播放视频,以及Freeform用于在大屏幕上显示任意大小的窗口。根据Android Developers (2025),屏幕宽度为600dp及以上的设备必须支持Multi-Window,每个开发人员都必须使应用程序适应可能的窗口大小变化。
要点
Multi-Window — 是Android 7.0 Nougat(API 24)中引入的一项功能,允许在屏幕上同时运行两个或更多应用程序。这一模式是Google对平板电脑和大屏设备日益流行的回应,在这些设备上,单任务模式限制了生产力。
在Android 7.0之前,每个应用程序占据整个屏幕——在应用之间切换时,上一个应用会被最小化。Multi-Window改变了这一模式:现在应用程序可以占据部分屏幕并保持活动状态。对于开发人员来说,这意味着onConfigurationChanged和处理大小变化成为强制性的。
在Android 12L(2022)中,Google将Multi-Window设为具有大屏设备的默认模式——平板电脑上的所有应用程序都在允许多窗口的模式下运行。只有清单中明确禁止的应用程序例外。
Split Screen — 最常见的模式。屏幕水平或垂直分成两部分,用户可以拖动分隔线。在手机和平板电脑上可用。通过Overview(Recents)启动——将应用图标拖到上边缘或下边缘。
Picture-in-Picture(PiP) — 适用于视频和导航应用程序的模式。内容显示在一个浮动小窗口(约占屏幕的15–25%)中,可以移动。适用于Android 8.0+。通过Activity中的enterPictureInPictureMode()激活。
Freeform — 任意大小窗口的模式,类似于桌面窗口管理器。适用于Android TV和某些制造商的大屏设备(Samsung DeX)。应用程序在带有标题和控制按钮的窗口中运行。
当用户激活Multi-Window时,Android会为每个应用程序创建一个新的Activity实例并分配可用屏幕空间。Activities被放置在单独的任务(Task)中,但使用相同的StackView,它们之间有分隔线。
系统通过onConfigurationChanged()通知每个Activity大小变化。如果Activity不处理此事件——它将被重新创建(recreate)。对于Split Screen,窗口宽度可能减少到220 dp——平台支持的最小宽度。
Android允许应用程序通过清单中的android:minWidth和android:minHeight声明最小宽度。如果可用空间小于指定值——Activity进入暂停状态。
要支持Multi-Window,需要在清单中设置android:resizeableActivity="true"标志。这意味着应用程序可以在窗口变化时调整大小。默认情况下,在Android 12L+上,所有应用程序都被视为resizeable——此标志被忽略。
当窗口大小变化时,Activity可能被重新创建(默认)或在onConfigurationChanged中处理事件(如果在清单中指定了configChanges="screenSize|smallestScreenSize")。建议为关键Activity指定configChanges,以避免状态丢失。
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|orientation" />
对于不支持大小变化的应用程序,Android会显示一个带有警告的对话框。在这种情况下,切换到多窗口模式时,系统可能会终止Activity并显示带有重新启动建议的snackbar。
Multi-Window改变了标准的Activity生命周期。当另一个应用程序在相邻窗口中变为活动状态时,当前Activity会收到onPause()调用,但不会收到onStop()——它仍然可见,尽管不在焦点中。这一点很重要:视频播放器应该在onPause时继续播放,而不是在onStop时。
开发人员需要区分状态:onPause + isInMultiWindowMode()= true仅表示失去焦点,而不是离开屏幕。对于视频和动画,这是不停止播放的信号,仅取消控制元素的突出显示。
退出Multi-Window时,onMultiWindowModeChanged()在onResume()之前被调用。这提供了在用户开始交互之前为全屏模式重建界面的机会。
第一条规则——保持状态。在多窗口模式下,Activity随时可能被重新创建。对于需要在配置更改之间保留的所有数据,使用ViewModel中的SavedStateHandle或onSaveInstanceState。
第二条——在最小宽度220 dp下测试。此值被认为是Split Screen中最窄的窗口。界面必须保持可读性和功能性。如果某些元素超出边界——使用Window Size Class在布局之间切换。
第三条——禁用Multi-Window中不起作用的功能。例如,如果屏幕太小,Camera可能不可用。在启动相机或其他全屏功能之前检查isInMultiWindowMode()。
常见问题
在清单中设置android:resizeableActivity="false"。在Android 12L+上,大屏设备会忽略此标志,因此要完全禁用,请使用android:maxAspectRatio。
从Activity调用isInMultiWindowMode()。如果应用程序在Split Screen、PiP或Freeform中运行,该方法返回true。您还可以订阅onMultiWindowModeChanged()。
在Android TV上只有Picture-in-Picture模式可用。Split Screen和Freeform不受支持——电视使用带有角落PiP窗口的主屏幕。
前台服务会继续运行,无论模式如何。但如果应用程序切换到PiP,系统可能会暂时暂停执行以节省资源。
Android通过ClipData和View.OnDragListener支持Multi-Window中窗口之间的Drag and Drop。数据通过ContentProvider或带有FLAG_GRANT_READ_URI_PERMISSION的Intent传输。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。