安卓返回键退出应用本质是onbackpress未正确拦截——必须在函数首行return true,后续逻辑异步执行;需条件编译区分平台,双击退出须手动管理时间戳,非首页建议禁用该逻辑。

安卓手机按返回键直接退出应用,本质是没做拦截或拦截逻辑写错了——onBackPress 函数入口没立刻 return true,系统就默认执行退栈,页面都切走了,弹窗都来不及显示。
onBackPress 必须在函数开头 return true
这是硬性要求,不是可选项。不写、晚写、只在分支里写,都会导致拦截失败。
- ❌ 错误写法:
if (res.confirm) { plus.runtime.quit(); }然后才return true—— 用户还没点确认,上一页已经退掉了 - ✅ 正确写法:第一行就
return true,后续所有逻辑(弹窗、计时、退出)必须异步执行 - 只对物理键拦截:
if (options.from !== 'backbutton') return false,避免干扰uni.navigateBack()等 JS 调用
双击退出必须自己记时间戳,不能依赖全局状态
onBackPress 每次触发都是独立事件,没有“上次触发时间”这种上下文。你得手动存、手动清。
- 变量必须挂载在
this.lastBackTime(App.vue 实例 data 或 export default 外层),不能用局部变量 - 判断间隔用
Date.now() - this.lastBackTime ,2000ms 是经验值,太短易误触,太长体验拖沓 - 清空必须用
setTimeout(() => { this.lastBackTime = 0; }, 2000),箭头函数确保this指向正确 - 非首页(如子页)建议禁用双击逻辑,用
getCurrentPages().length === 1判断是否在栈底
平台差异必须用条件编译包裹
plus.runtime.quit() 只在 Android 有效;iOS 静默失败;H5 根本不触发 onBackPress。不加包裹,编译或运行时直接报错。
- Android 退出:
// #ifdef APP-PLUS包裹plus.runtime.quit() - iOS 降级:
uni.showToast({ title: '双击 Home 键退出' }),别调quit() - H5 不走
onBackPress,得单独判断:uni.getSystemInfoSync().platform === 'h5',然后用history.back() - WebView 场景要额外查
canBack(),再决定是webview.back()还是plus.runtime.quit()
最容易被忽略的是:H5 页面刷新后 getCurrentPages() 为空,uni.navigateBack() 静默失败;iOS 侧滑返回根本不进 onBackPress,得关 "popGesture": "close" 才能触发;还有部分安卓厂商限制 quit() 后自启,移到后台比强行退出更稳妥。











