顺 “瓜” 摸 “藤”(鸿蒙开发)—— 1. 应用的二次退出 / 防误触退出(小📕案例版)

1. 引子

我们在开发时,会有突发奇想或者看到好的设计,希望能够模仿,但是会有处于毫无头绪的时候,不知道该如何下手,这就相当于一个考试,给你一个题目叫你作答,但不同于校园考试,他并不是在给定你范围并且复习的情况下进行作答。它是未知的,并不是顺藤摸瓜,总会遇到你所不清楚的内容,我希望能够通过案例顺瓜摸藤进行学习,通过“瓜”来推出是什么“藤”。

2. 注

这些案例都是现有APP的形式进行推论,因本人能力有限,可能不会是最优方案,如果您有更优方案,欢迎指出并讨论。
该系列的代码全部开源
·在github
https://github.com/JinnyWang-Space/HMOS_Space
或者gitee
https://gitee.com/jinnywang/HMOS_Space
上均可查看,下载使用

3. 案例

应用的二次退出(防误触退出)

循环播放
已暂停

视频加载中...

小📕

案例分析

应用第一次退出后弹出提示框,在提示框消失前退出,则直接退出app, 反之,则重回第一次退出过程。

4. 流程图

exit-flowchart

5. 知识点

5.1 Timer(定时器)

·setTimeout (设置定时器)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-timer#settimeout
·clearTimeout (取消定时器)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-timer#cleartimeout

5.2 自定义组件生命周期(onBackPress,aboutToDisappear)

·onBackPress(返回逻辑)
注:在@Entry装饰器下的页面才能生效
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#onbackpress
·aboutToDisappear(组件消失生命周期)
文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#abouttodisappear

5.3 @ohos.promptAction (弹窗)

文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-promptaction#promptactionopentoast18

6. 代码(基础)

6.1 状态管理V1版

ArkTS
1import { promptAction } from '@kit.ArkUI';
2
3@Entry
4@Component
5struct Index {
6  // 是否为第一次退出
7  @State isFirstExit: boolean = false;
8  // 记录定时器ID,方便后续操作(删除定时器)
9  @State timeoutID?: number = undefined;
10
11  // 系统返回操作
12  // true 代表拦截返回操作,false 代表不拦截返回操作
13  onBackPress(): boolean | void {
14    // 第一次返回操作

6.2 状态管理V2版

ArkTS
1import { promptAction } from '@kit.ArkUI';
2
3@Entry
4@ComponentV2
5struct Index {
6  // 是否为第一次退出
7  @Local isFirstExit: boolean = false;
8  // 记录定时器ID,方便后续操作(删除定时器)
9  @Local timeoutID?: number;
10
11  // 系统返回操作
12  // true 代表拦截返回操作,false 代表不拦截返回操作
13  onBackPress(): boolean | void {
14    // 第一次返回操作

7. 代码(进阶)

采用 MVVM模式 思想,将其 数据 视图 独立出来,降低耦合,在ViewModel层 管理UI状态与业务逻辑 ,鸿蒙的装饰器对于这种思想有着天然的优势。

·对于刚入门,进阶模式可能会比较抽象,可以先通过里面的提示进行知识补充或者暂时只了解基础版代码,但里面的内容最终是一定要掌握的
·如果为入门,需先了解什么是 MVVM模式
·如果使用状态管理 V1 版本 ,需先了解什么是 @Observed @Track
·如果使用状态管理 V2 版本 ,需先了解什么是 @ObservedV2 @Trace
·最重要的,尽量不要状态管理V1与V2版混用,即视图模型层使用的状态管理与视图层使用的状态管理不一致,这里我更倾向于使用V2版本,因为它相比于V1版,更加强大,使用更加方便,对于想了解V1与V2具体差别的查看这篇文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-v1-v2-update-difference

7.1 封装为ViewModel层(状态管理V1版)

ExitViewModel(退出视图模型),管理第一次退出,最终退出,销毁定时器。

ArkTS
1import { promptAction } from "@kit.ArkUI";
2
3@Observed
4export class ExitViewModel {
5  // 是否为第一次退出
6  @Track isFirstExit: boolean = false;
7  // 记录定时器ID,方便后续操作(销毁定时器)
8  @Track timeoutID?: number;
9
10  // 第一次退出操作
11  firstExit(){
12    // 更改退出状态
13    this.isFirstExit = true;
14    // 清理旧的定时器(防御性编程)

7.2 封装为ViewModel层(状态管理V2版)

ArkTS
1import { promptAction } from "@kit.ArkUI";
2
3@ObservedV2
4export class ExitViewModel {
5  // 是否为第一次退出
6  @Trace isFirstExit: boolean = false;
7  // 记录定时器ID,方便后续操作(销毁定时器)
8  @Trace timeoutID?: number;
9
10  // 第一次退出操作
11  firstExit(){
12    // 更改退出状态
13    this.isFirstExit = true;
14    // 清理旧的定时器(防御性编程)

视图层的引用

7.2.1 状态管理V1版

ArkTS
1import { ExitViewModel } from '../viewmodel/ExitViewModel';
2
3@Entry
4@Component
5struct Index {
6  // 创建退出视图模型实例
7  @State exitVM: ExitViewModel = new ExitViewModel();
8
9  // 系统返回操作
10  // true 代表拦截返回操作,false 代表不拦截返回操作
11  onBackPress(): boolean | void {
12    if (!this.exitVM.isFirstExit) {
13      this.exitVM.firstExit();
14    } else {

7.2.2 状态管理V2版

ArkTS
1import { ExitViewModel } from '../viewmodel/ExitViewModel';
2
3@Entry
4@ComponentV2
5struct Index {
6  // 创建退出视图模型实例
7  @Local exitVM: ExitViewModel = new ExitViewModel();
8
9  // 系统返回操作
10  // true 代表拦截返回操作,false 代表不拦截返回操作
11  onBackPress(): boolean | void {
12    if (!this.exitVM.isFirstExit) {
13      this.exitVM.firstExit();
14    } else {

8. 实现效果

循环播放
已暂停

视频加载中...

实现效果

实现效果

1. 应用第一次退出后弹出提示框,在提示框消失前退出,再次滑动则直接退出app。
2. 在提示框消失之后,再次退出,则重回第一次退出过程。
3. 应用退出后,提示框消失有一定时间,在消失前的间隔中(promptToast默认显示是2S),再次点击APP,即使在提示框未消失,也是会进行第一次退出过程。

🎉 恭喜你!完成鸿蒙开发案例中的应用的二次退出