🎉 博客主页:【剑九_六千里-CSDN博客】【剑九_六千里-掘金社区
🎨 上一篇文章:【HarmonyOS第十章:路由
🎠 系列专栏:【HarmonyOS系列
💖 感谢大家点赞👍收藏⭐评论✍

在这里插入图片描述

在这里插入图片描述


引言

本文深入探讨了UIAbility的生命周期及其在实际项目中的应用,通过详细的步骤和示例,帮助开发者理解各个生命周期阶段的作用及如何利用这些生命周期回调进行有效的资源管理和界面控制。

此外,本文还介绍了页面和自定义组件的生命周期,进一步丰富了开发者对HarmonyOS应用开发的理解。

1. UIAbility生命周期

1.1 UIAbility生命周期分为创建、后台运行、前台运行、销毁的四个阶段。

如下:

在这里插入图片描述

1.2 WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStageWindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。

在这里插入图片描述

  • onCreate:在 Ability 创建时被调用,用于执行初始化和设置业务逻辑。
  • onDestroyAbility 的生命周期回调,在 Ability 销毁时触发,用于执行资源清理和其他清理操作。
  • onWindowStageCreate:在 WindowStage 创建完成后触发。
  • onWindowStageDestroy:在 WindowStage 销毁后触发。
  • onForegroundAbility 的生命周期回调,当应用从后台切换到前台时调用。
  • onBackgroundAbility 的生命周期回调,当应用从前台切换到后台时调用。

1.3 实际项目中的UIAblity生命周期

src/main/ets/entryability/EntryAbility.ets
在这里插入图片描述

1.4 测试UIAblity各生命周期执行

打开模拟机:

在这里插入图片描述

打开终端,进入日志界面:

在这里插入图片描述

输入筛选条件:

在这里插入图片描述

输入testTag作为筛选条件是因为在 src/main/ets/entryability/EntryAbility.ets 文件中,定义了输出的格式:

在这里插入图片描述
然后启动模拟器上的项目:

在这里插入图片描述

1.4.1 应用创建阶段

执行了 onCreateonWindowStageCreateonForeground生命周期

在这里插入图片描述
让我们的应用在后台运行:

在这里插入图片描述
点击任意空白区域,应用即可在后台运行:

在这里插入图片描述

1.4.2 应用从前台运行变为后台运行阶段

此时执行了onBackground生命周期:

在这里插入图片描述

1.4.3 应用从后台运行转为前台运行阶段

再次打开我们的应用,执行了onForeground生命周期:

在这里插入图片描述

1.4.4 应用销毁阶段

销毁我们的应用:

在这里插入图片描述

此时执行了 onBackgroundonWindowStageDestroyonDestroy生命周期,应用已经被销毁了:

在这里插入图片描述

2. 页面生命周期/自定义组件生命周期

  • 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。
  • 自定义组件@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

2.1 页面生命周期

被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

2.2 组件生命周期

一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

2.3 生命周期流程图

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期。

在这里插入图片描述

2.4 测试页面/自定义组件生命周期

entry/src/main/ets/pages/LifeCycle.ets

import router from '@ohos.router';

@Entry
@Component
struct LifeCycle {
  @State message: string = '这是首页';
  // 被@Component装饰的组件生命周期
  // 组件即将出现时触发,在build之前触发,只触发一次
  aboutToAppear(): void {
    console.log('testTag', `组件即将出现:aboutToAppear`)
  }

  // 被@Component装饰的组件生命周期
  // 组件销毁之前触发,如清理定时器
  aboutToDisappear(): void {
    console.log('testTag', `组件销毁之前:aboutToDisappear`)
  }

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  // 页面每次显示时触发一次,在build之后触发,可触发多次
  onPageShow(): void {
    console.log('testTag', `页面显示:onPageShow`)
  }

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  // 页面每次隐藏时触发一次,可触发多次
  onPageHide(): void {
    console.log('testTag', `页面隐藏:onPageHide`)
  }

  build() {
    Column() {
      Text(this.message)
        .id('LifeCycleHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Button("跳转到自定义组件页面").onClick(() => {
          router.pushUrl({
            url: 'pages/LifeCycleComponent'
          })
      })
    }
    .height('100%')
    .width('100%')
  }
}

entry/src/main/ets/pages/LifeCycleComponent.ets

@Entry
@Component
struct LifeCycleComponent {
  @State message: string = '这是其它页面';
  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  // 点击返回时触发
  onBackPress(): void {
    console.log('testTag', `点击返回:onBackPress`)
  }
  build() {
    Column() {
      Text(this.message)
        .id('LifeCycleComponentHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
    }
    .height('100%')
    .width('100%')
  }
}

2.4.1 初始化

打开应用:

在这里插入图片描述

执行aboutToAppearonPageShow生命周期:

在这里插入图片描述

2.4.2 隐藏

点击跳转到其它页面:

在这里插入图片描述·
执行了onPageHide生命周期:
在这里插入图片描述

2.4.3 返回

点击返回按钮:
在这里插入图片描述
此时触发了onBackPressonPageShow生命周期:

在这里插入图片描述

2.4.4 销毁

关闭我们的应用:

在这里插入图片描述
执行了 onPageHideaboutToDisappear 生命周期:

在这里插入图片描述

3. 总结

本文详细解析了UIAbility的生命周期,包括创建、后台运行、前台运行和销毁四个主要阶段,并通过实际项目代码展示了如何在不同生命周期阶段执行相应的操作。

同时,文章还介绍了页面和自定义组件的生命周期,包括页面的onPageShowonPageHideonBackPress以及组件的aboutToAppearaboutToDisappear等生命周期方法。通过具体的测试案例,验证了这些生命周期方法在不同场景下的触发情况,为开发者提供了实践指导。

希望本文能够帮助开发者更好地理解和应用HarmonyOS的生命周期管理机制,提升应用的稳定性和用户体验。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐