HarmonyOS 鸿蒙Next中实现应用返回到栈顶或路由起始页后,连续返回两次退出应用,返回一次时提示“再次返回将退出应用”

HarmonyOS 鸿蒙Next中实现应用返回到栈顶或路由起始页后,连续返回两次退出应用,返回一次时提示“再次返回将退出应用” 试给出代码或演示Demo。

3 回复

前提:自定义组件需要被 @Entry 修饰

关键点:自定义组件的生命周期-onBackPress

示例代码:

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秒内再次按返回键,应用退出

注意事项

  1. router.clear()会清空所有历史记录,慎用
  2. 提示框默认持续2秒,期间再次返回会退出应用
  3. 可通过router.hideAlertBeforeBackPage()手动取消提示

这种方案符合HarmonyOS应用退出规范,能有效防止用户误操作退出应用。

回到顶部