Android多窗口模式下无法在相邻屏幕打开Activity问题排查
Android分屏模式下跨屏启动Activity问题排查与解答
问题场景
已在多窗口/分屏模式下打开同一应用的两个Activity,期望点击屏幕1的按钮时,在屏幕2打开新的MyActivity,但按官方文档实现后,新Activity仍在屏幕1打开。
已尝试的实现代码
第一种写法
val intent = Intent(this, MyActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or FLAG_ACTIVITY_NEW_TASK) startActivity(intent)
第二种写法
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse(MyActivity::class.java.name) intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or FLAG_ACTIVITY_NEW_TASK) startActivity(intent)
已配置的Manifest设置
在application标签及对应activity标签中已设置:
android:resizeableActivity="true"
核心疑问
FLAG_ACTIVITY_NEW_TASK是否为必填参数?- 若不想创建新任务是否可行?
问题原因与解决方案
1. 跨屏启动失效的核心原因
FLAG_ACTIVITY_LAUNCH_ADJACENT仅为系统提供"尝试在相邻窗口启动"的建议,无法强制跨屏。要确保在屏幕2启动,需补充窗口显示模式的明确配置:
正确实现代码
val intent = Intent(this, MyActivity::class.java) // 若需独立任务栈则保留该标记,否则可根据启动模式调整 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 配置启动选项,指定分屏另一侧或目标屏幕 val options = ActivityOptions.makeBasic() // 方式1:指定分屏启动模式(强制在分屏窗口打开) options.setLaunchWindowingMode(WindowManager.LayoutParams.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) // 方式2:针对多物理屏幕,可先获取目标屏幕的displayId再设置 // val displayManager = getSystemService(DisplayManager::class.java) // val displays = displayManager.displays // if (displays.size > 1) options.setLaunchDisplayId(displays[1].displayId) startActivity(intent, options.toBundle())
第二种写法的错误说明
用Intent.ACTION_VIEW搭配类名Uri的写法无效,系统无法识别此类Uri来启动指定Activity,应始终使用显式Intent(第一种写法的Intent创建方式)。
2. 关于FLAG_ACTIVITY_NEW_TASK的解答
- 是否必填?
非强制,但分屏场景下建议添加。如果启动的Activity启动模式为singleTask/singleInstance,或当前任务栈存在限制,该标记是必需的;普通场景下,添加它能避免新Activity与原任务栈绑定,提升跨屏启动的成功率。 - 能否不创建新任务?
可以,但需满足两个条件:原Activity所在任务栈允许添加新Activity(启动模式无singleInstance等限制)、系统允许在同一任务栈的相邻窗口启动。但这种情况下无法保证跨屏,系统可能将新Activity放在原屏幕的同一任务栈窗口中,因此如果必须跨屏,建议保留FLAG_ACTIVITY_NEW_TASK并配合ActivityOptions控制。
内容的提问来源于stack exchange,提问作者M. Usman Khan
相关产品推荐
相关产品推荐

