HarmonyOS/OpenHarmony 双击返回与退出App

2023-02-23 11:40:22 浏览数 (1)

作者:坚果,公众号:”大前端之旅“,哔哩哔哩,OpenHarmony布道师,OpenHarmony校源行开源大使,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 (应用上下文)

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

代码语言:javascript复制
import app from '@system.app';

app.terminate

退出当前Ability。

代码语言:javascript复制
import app from '@system.app';
import prompt from '@ohos.prompt';

@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%')
  }
}

0 人点赞