Android副屏启动Activity后如何无需结束Activity切回镜像模式
Android副屏显示模式切换方案
方案1:普通三方应用兼容方案(无需系统权限,不销毁Activity)
原理:Android副屏之所以退出镜像模式,是因为当前有专属的顶层Activity运行在副屏上。你只需将该Activity动态切换到主屏运行,副屏无专属内容时会自动恢复镜像模式,整个过程Activity不会销毁,状态完全保留。
切回镜像模式的代码示例:
// 获取主屏ID val mainDisplayId = displayManager.getDisplay(Display.DEFAULT_DISPLAY).displayId // 替换为你实际运行在副屏的Activity类名 val intent = Intent(context, YourSecondaryActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_NEW_TASK) } if (isActivityStartAllowedOnDisplay(context, mainDisplayId, intent)) { val ops = ActivityOptions.makeBasic().apply { launchDisplayId = mainDisplayId } context.startActivity(intent, ops.toBundle()) }
需要恢复副屏显示专属Activity时,复用你原有启动代码指定副屏ID即可,已运行的Activity会直接切回副屏,无需重建。
方案2:系统级应用方案(需系统权限/签名)
如果你是系统预装应用或者拥有系统签名,可以调用系统隐藏API直接控制镜像开关,无需移动Activity:
- 先在Manifest中申请权限:
<uses-permission android:name="android.permission.MANAGE_DISPLAY_MIRRORING" /> - 反射调用隐藏API切换镜像:
fun setDisplayMirroring(displayId: Int, enable: Boolean) { try { val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val method = DisplayManager::class.java.getMethod("setDisplayMirroringEnabled", Int::class.javaPrimitiveType, Boolean::class.javaPrimitiveType) method.invoke(displayManager, displayId, enable) } catch (e: Exception) { e.printStackTrace() // 版本不兼容或无权限时降级使用方案1 } } // 切回镜像调用:setDisplayMirroring(secondaryDisplayId, true) // 关闭镜像显示专属Activity调用:setDisplayMirroring(secondaryDisplayId, false)
注意事项
- Android 10及以上版本调用跨屏启动Activity逻辑前,需确保应用已获取
SYSTEM_ALERT_WINDOW悬浮窗权限,否则会被系统拦截 - 隐藏API方案仅适配AOSP原生逻辑,部分厂商定制ROM可能修改了副屏管理逻辑,需单独适配
内容的提问来源于stack exchange,提问作者陈朝勇
相关产品推荐
相关产品推荐

