HarmonyOS鸿蒙Next中双击返回与退出app的实现

HarmonyOS鸿蒙Next中双击返回与退出app的实现

HarmonyOS/OpenHarmony 双击返回与退出app

作者:坚果,公众号:“大前端之旅”,哔哩哔哩,OpenHarmony布道师,OpenHarmony校源行开源大使,电子发烧友鸿蒙MVP,51CTO博客专家博主,阿里云博客专家。

有时候我们会遇到这样的一个需求,就是双击返回与退出app。

那么在HarmonyOS/OpenHarmony中如何如何实现呢,

HarmonyOS测试环境:ApI8,HarmonyOS3,

Open Harmony测试环境:ApI9,OpenHarmony3.2.beta4

在此之前,我们需要先来了解一下一下自定义组件的声明周期

自定义组件的声明周期

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

需要提前说明的两个注意点是:

  • 允许在生命周期函数中使用Promise和异步回调函数,比如网络资源获取,定时器设置等;
  • 不允许在生命周期函数中使用async await。

接下来我们就来看一下组件声明周期

aboutToAppear

aboutToAppear函数在创建自定义组件的新实例后,在执行其build函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build函数中生效。

aboutToDisappear

aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

onPageShow

页面每次显示时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。

onPageHide

页面每次隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry修饰的自定义组件生效。

onBackPress

当用户点击返回按钮时触发,仅@Entry修饰的自定义组件生效。返回true表示页面自己处理返回逻辑,不进行页面路由,返回false表示使用默认的路由返回逻辑。不设置返回值按照false处理。

看完声明周期的解释大家也就知道在哪儿对双击返回与界面退出提示做出逻辑处理了,对就是在onBackPress

接下来就看完整代码,就是对点击时间的一个比较。

然后那就是

@system.app (应用上下文)

在使用的时候需要先导入。

import app from '[@system](/user/system).app';

app.terminate

退出当前Ability。

import app from '[@system](/user/system).app';
import prompt from '@ohos.prompt';

[@Entry](/user/Entry)
@Component
struct Index {
  @State message: string = 'Hello World'
  // 记录上一次点击时间
  private pretime: number = new Date().getTime();
  onBackPress() {
    if (-1 == this.pretime) {
      // 第一次点击返回键,提示toast
      prompt.showToast({
        message: "再按一次退出应用"
      })
      return true;
    } else {
      let currentTime = new Date().getTime();
      let flag = currentTime - this.pretime;
      if (flag > 2000) {
        //两次点击时间太长不做处理
        this.pretime = currentTime;
        return true;
      } else {
        app.terminate(); // 2秒内点击,退出当前Ability。
      }
    }
    return false;
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中双击返回与退出app的实现的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复
//region 两次返回关闭

private pressTime: number = 0;
onBackPress() {
  let currentTime = new Date().getTime();
  if (this.pressTime == 0 || currentTime - this.pressTime > 2000) {
    this.pressTime = currentTime;
    // 第一次点击返回键,提示toast
    Utility.showToast("再按一次退出应用")
    return true;
  } else {
    // 2秒内点击,退出当前Ability。
    AppUtils.exit(); //这里自己实现的获取当前UIAbility.context.terminateSelf()

  }
  return false;
}
//endregion

更多关于HarmonyOS鸿蒙Next中双击返回与退出app的实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个是虚拟按健,或实体按健返回时不会两三秒内不会再次触发,我之前也遇到过。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

不好用,代码是错误的,api9下,并且prompt在展示的情况下会先关闭prompt,不会走onBackPress方法

这个有什么替代的方法吗,用 promptAction.showToast,返回键确实会先关闭 toast,

我也遇见这个问题了, 有什么解决办法吗?

有,升级api11就好了。

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。

有个疑问,onBackPress方法返回值明明是void,为什么上面代码要返回boolean类型,去掉return后,双击返回还不生效了。谁能解释下?

我试了下在远程模拟器上双击屏幕左下角的返回键 没反应

private pretime: number = new Date().getTime();
onBackPress() {
  if (-1 == this.pretime) {
    // 第一次点击返回键,提示toast
    prompt.showToast({
      message: "再按一次退出应用"
    })
    return true;
  } else {
    let currentTime = new Date().getTime();
    let flag = currentTime - this.pretime;
    if (flag > 2000) {
      //两次点击时间太长不做处理
      this.pretime = currentTime;
      return true;
    } else {
      app.terminate(); // 2秒内点击,退出当前Ability。
    }
  }
  return false;
}

在HarmonyOS鸿蒙Next中,双击返回与退出App的实现可以通过监听返回键事件来实现。具体步骤如下:

  1. 监听返回键事件:在AbilityPage中重写onBackPress()方法,监听返回键的按下事件。

  2. 记录点击时间:在onBackPress()方法中,记录第一次点击返回键的时间,并在第二次点击时判断时间间隔。

  3. 判断双击逻辑:如果两次点击的时间间隔小于设定的阈值(如500毫秒),则执行退出App的逻辑;否则,记录当前点击时间,等待下一次点击。

  4. 退出App:调用terminateAbility()方法退出当前应用。

示例代码:

private long firstClickTime = 0;

@Override
public boolean onBackPress() {
    long currentTime = System.currentTimeMillis();
    if (currentTime - firstClickTime < 500) {
        terminateAbility();
        return true;
    } else {
        firstClickTime = currentTime;
        return true;
    }
}
回到顶部