HarmonyOS 鸿蒙Next中实现应用返回到栈顶或路由起始页后,连续返回两次退出应用,返回一次时提示“再次返回将退出应用”
HarmonyOS 鸿蒙Next中实现应用返回到栈顶或路由起始页后,连续返回两次退出应用,返回一次时提示“再次返回将退出应用” 试给出代码或演示Demo。
3 回复
前提:自定义组件需要被 @Entry 修饰
示例代码:
import { hilog } from '@kit.PerformanceAnalysisKit';
import { systemDateTime } from '@kit.BasicServicesKit';
import { PromptAction } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';
const DOMAIN = 0xfff0
const TAG = `NavigationExample`
[@Entry](/user/Entry)
@Component
struct NavigationExample {
// Context
private UIContext: UIContext = this.getUIContext()
private ApplicationContext: common.ApplicationContext = this.getUIContext().getHostContext() as common.ApplicationContext
private UIAbilityContext: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext
private promptAction : PromptAction = this.UIContext.getPromptAction()
// Navigation 页面栈
pageInfos: NavPathStack = new NavPathStack();
// 记录触发返回时的时间
exitTime: number = 0
build() {
Navigation(this.pageInfos) {
// ...
}
}
/**
* 在router路由页面(即[@Entry](/user/Entry)装饰的自定义组件)生效,当用户点击返回按钮时触发。
* @returns 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理。
*/
onBackPress() {
hilog.info(DOMAIN, TAG, `#onBackPress() executed`);
let currentTime = systemDateTime.getTime(false)
// 两次返回操作时间间隔,当前为大于2000ms就执行退出Ability操作。按照业务需求修改此间隔
if (currentTime - this.exitTime > 2000) {
this.exitTime = currentTime
this.promptAction.showToast({ message: '再次返回将退出应用', duration: 2000 })
return true
} else {
// 停止Ability自身。(不影响已其他启动的UIAbility)
this.UIAbilityContext.terminateSelf()
.then(()=>{
hilog.info(DOMAIN, TAG, `#onBackPress#terminateSelf() terminate Ability Sucessfully!`);
})
.catch((error: BusinessError) => {
hilog.error(DOMAIN, TAG, `ERROR: #onBackPress#terminateSelf(): ${JSON.stringify(error)}`)
})
// 终止应用的所有进程,进程退出时不会正常走完应用生命周期。
// this.ApplicationContext.killAllProcesses()
// .then()
// .catch()
return false
}
}
}
更多关于HarmonyOS 鸿蒙Next中实现应用返回到栈顶或路由起始页后,连续返回两次退出应用,返回一次时提示“再次返回将退出应用”的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next中,可通过router.clear()清空路由栈至首页,再使用router.back()返回。监听返回事件,利用router.getLength()判断栈深度。当栈深度为1时,拦截返回操作并提示“再次返回将退出应用”。第二次触发返回时,调用router.back()退出应用。具体实现需在onBackPress()生命周期中处理。
在HarmonyOS Next中,可以通过管理页面栈和监听返回事件来实现该功能。核心是使用router.clear()清空历史栈,并配合router.showAlertBeforeBackPage()设置返回提示。
以下是关键代码示例:
1. 返回到栈顶/起始页并监听返回
import { router } from '@kit.RouterKit';
// 返回到首页(栈顶)
function backToHome() {
// 清空历史栈,只保留当前页
router.clear();
// 跳转到首页
router.pushUrl({
url: 'pages/Home'
});
// 设置返回提示
router.showAlertBeforeBackPage({
message: '再次返回将退出应用'
});
}
2. 在目标页(如首页)监听返回事件
import { router } from '@kit.RouterKit';
// 页面显示时设置返回提示
onPageShow(() => {
router.showAlertBeforeBackPage({
message: '再次返回将退出应用'
});
});
// 处理返回操作
onBackPress(() => {
// 可在此处添加自定义逻辑
return false; // 返回false由系统处理提示
});
3. 完整示例场景 假设有页面A(首页)→B→C:
- 在C页调用
backToHome()会清空栈并跳转到A - 此时在A页按返回键,会弹出“再次返回将退出应用”提示
- 2秒内再次按返回键,应用退出
注意事项:
router.clear()会清空所有历史记录,慎用- 提示框默认持续2秒,期间再次返回会退出应用
- 可通过
router.hideAlertBeforeBackPage()手动取消提示
这种方案符合HarmonyOS应用退出规范,能有效防止用户误操作退出应用。

