feat: 完善安卓端返回键处理与退出逻辑 - #28
Merged
Merged
Conversation
- 新增安卓端全局返回键处理栈,支持多层UI自定义返回逻辑 - 为多个弹窗、菜单组件添加安卓返回键关闭支持 - 优化用户协议与登录弹窗的返回键拦截逻辑 - 新增app原生退出方法,支持清理服务后安全退出 - 修复异常场景下全屏状态残留问题 - 扩展naive modal类型以支持自定义返回键行为
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📌 变更类型
📝 变更说明
背景
安卓物理返回键此前直接走
CapacitorApp.exitApp(),存在两个体验断层:exitApp仅 finish Activity,前台服务(PlaybackService、FloatingLyricService)继续存活,通知栏与桌面歌词残留;缺乏二次确认,误触退出体验差解决方案
1. 全局 Back 处理栈(useAndroidBack)
true则消费本次按键2. 弹层 / 菜单接入
n-modal全局包装器:Provider.vue 劫持useModal().create,默认所有 modal 可被 back 关闭,显式_backable: false可禁用(如用户协议、登录强制流程)n-drawer/n-dropdown/ 自定义弹窗(SongListMenu/CoverMenu/SearchInpMenu)接入 useBackClosable.n-dropdown-menu多于一层,向 document 派发ArrowLeft让 naive UI 内部折叠子菜单,第二次 back 才关整个 dropdown3. 原生退出能力
stopService(FloatingLyricService)→stopService(PlaybackService),每段独立 try/catch4. 退出确认弹窗
$dialog.warning二次确认CapacitorApp.exitApp5. 边界修复
statusStore.isImmersiveFullscreen置 false,避免异常路径下沉浸式状态残留导致 back 死循环6. 类型扩展
_backable?: boolean🔗 关联 Issue
Closes #
📱 影响范围
✅ 自检清单
devpnpm lint且无 warningpnpm typecheck且无报错🧪 测试方式
A. Back 多层关闭
B. 退出确认
/或/home)按 back → 弹"退出 SPlayer / 确定要退出吗?"C. 原生退出彻底性(关键)
D. 强制弹窗不被 back 误关
E. 沉浸式横屏 back
💬 其他说明
兼容性风险
keyboard: true+ ArrowLeft 行为,若升级 naive UI 改了快捷键实现需回归finishAndRemoveTask需 Android 5.0+,项目 minSdk 已满足已知边界
_backable: false的 modal 仍会消费 back 防止穿透,但 modal 本身不关