【鸿蒙开发】生命周期

这篇具有很好参考价值的文章主要介绍了【鸿蒙开发】生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. UIAbility组件生命周期

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。

UIAbility生命周期状态

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

 1.1 Create状态

Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 页面初始化
    }
    // ...
}

1.2 WindowStageCreate和WindowStageDestroy状态

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

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面并根据需要订阅WindowStage的事件(获焦/失焦、可见/不可见)。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)

        // 设置UI界面加载
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }
}

在UIAbility实例销毁之前会进入onWindowStageDestroy()回调,可以释放UI界面资源。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    // ...

    onWindowStageDestroy() {
        // 释放UI界面资源
    }
}
  • onCreate:在 Ability 创建时被调用,用于执行初始化和设置业务逻辑。
  • onDestroy:在 Ability 销毁时触发,用于执行资源清理和其他清理操作。
  • onWindowStageCreate:在 WindowStage 创建完成后触发。
  • onWindowStageDestroy:在 WindowStage 销毁后触发。
  • onForeground:Ability 的生命周期回调,当应用从后台切换到前台时调用。
  • onBackground:Ability 的生命周期回调,当应用从前台切换到后台时调用。

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

2.1 页面生命周期

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

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

2.2 组件生命周期

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

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

2.3 生命周期流程

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

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

2.4 自定义组件的渲染流程

  • ArkUI框架创建自定义组件
  • 初始化自定义组件的成员变量
  • 执行aboutToAppear方法
  • 执行build方法渲染组件,在首次渲染时,框架会记录状态变量和组件的映射关系
  • 当状态变量的值更改时,框架根据映射关系,执行这些UI组件的更新函数
  • if分支或者ForEach渲染的数组个数改变,组件将被删除,在删除前执行aboutToDisappear

不建议在aboutToDisappear内使用async await,如果在aboutToDisappear使用中Promise或者回调方法,自定义组件将被保留在Promise的闭包中,直到回调方法被执行完,这个行为阻止了自定义组件的垃圾回收。

 2.5 示例

import router from '@ohos.router'

@Entry
@Component
struct Index {
  @State showChild: boolean = true;

  // 页面生命周期
  onPageShow() {
    console.info('Index onPageShow');
  }
  // 页面生命周期
  onPageHide() {
    console.info('Index onPageHide');
  }
  // 页面生命周期
  onBackPress() {
    console.info('Index onBackPress');
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('Index aboutToAppear');
  }
  // 组件生命周期
  aboutToDisappear() {
    console.info('Index aboutToDisappear');
  }

  build() {
    Column() {
      // this.showChild为true,创建Child子组件,执行Child aboutToAppear
      if (this.showChild) {
        Child()
      }
      // this.showChild为false,删除Child子组件,执行Child aboutToDisappear
      Button('删除子组件 Child')
        .margin({ bottom: 20 })
        .onClick(() => {
          this.showChild = false;
        })
      // push到DetailPage页面,执行onPageHide
      Button('跳转到 DetailPage')
        .onClick(() => {
          router.pushUrl({ url: 'pages/DetailPage' });
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Component
struct Child {
  @State title: string = 'Child';

  // 组件生命周期
  aboutToAppear() {
    console.info('Child aboutToAppear')
  }
  // 组件生命周期
  aboutToDisappear() {
    console.info('Child aboutToDisappear')
  }

  build() {
    Text(this.title).fontSize(50).onClick(() => {
      this.title = 'Child Click';
    })
  }
}

3. 同模块下的UIAbility跳转

3.1 创建 PaymentPage

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

@Entry
@Component
struct PaymentPage {
  @State message: string = 'payment page'

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

3.2 创建 PaymentAbility

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

修改 windowStage.loadContent 加载的页面

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

3.3 修改 Index.ets

import common from '@ohos.app.ability.common'
import Want from '@ohos.app.ability.Want'

@Entry
@Component
struct Index {
  @State message: string = 'index page'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button("去支付")
          .width('100%')
          .onClick(() => {
            const context = getContext(this) as common.UIAbilityContext;
            const want: Want = {
              'deviceId': '', // deviceId为空表示本设备
              'bundleName': 'com.example.myapplication',
              'abilityName': 'PaymentAbility',
              'moduleName': 'entry'
            }
            context.startAbility(want)
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

4. 不同模块下的UIAbility跳转

4.1 创建模块

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

4.2 修改 paymentModule 模块的 Index.ets

@Entry
@Component
struct Index {
  @State message: string = 'payment module page'

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

4.3 修改 entry 模块的 Index.ets

修改 abilityName 和 moduleName

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

import common from '@ohos.app.ability.common'
import Want from '@ohos.app.ability.Want'

@Entry
@Component
struct Index {
  @State message: string = 'index page'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button("去支付")
          .width('100%')
          .onClick(() => {
            const context = getContext(this) as common.UIAbilityContext;
            const want: Want = {
              'deviceId': '', // deviceId为空表示本设备
              'bundleName': 'com.example.myapplication',
              'abilityName': 'PaymentModuleAbility',
              'moduleName': 'paymentModule'
            }
            context.startAbility(want)
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

4.4 配置调起2个模块

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

 【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

4.5 两个模块之间传递数据

4.5.1 修改 entry 模块的 Index.ets

使用 parameters 选项添加自定义数据

使用 context.startAbilityForResult 方法启动 UIAbility 并获取返回结果

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

import common from '@ohos.app.ability.common'
import Want from '@ohos.app.ability.Want'

type PaymentAbilityParams = Record<string, boolean>

@Entry
@Component
struct Index {
  @State message: string = 'index page'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button("去支付")
          .width('100%')
          .onClick(async () => {
            const context = getContext(this) as common.UIAbilityContext;
            const want: Want = {
              deviceId: '', // deviceId为空表示本设备
              bundleName: 'com.example.myapplication',
              abilityName: 'PaymentModuleAbility',
              moduleName: 'paymentModule',
              parameters: {
                orderId: Date.now()
              }
            }
            // context.startAbility(want)
            const paymentAbilityResult = await context.startAbilityForResult(want)
            const params = paymentAbilityResult.want?.parameters as PaymentAbilityParams
            if (params?.isPay) {
              AlertDialog.show({
                message: "支付成功"
              })
            } else {
              AlertDialog.show({
                message: "支付失败"
              })
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
4.5.2 修改 paymentModule 模块的 PaymentModuleAbility

在 UIAbility 的 onCreate 中接收参数,并保存到 AppStorage 中

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

type AbilityParams = Record<string, number>

export default class PaymentModuleAbility extends UIAbility {
  onCreate(want, launchParam) {
    const params = want.parameters as AbilityParams;
    AppStorage.SetOrCreate<number>("orderId", params.orderId);
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}
4.5.3 修改 paymentModule 模块的 Index.ets

从 storage 中获取 orderId

点击支付按钮, PaymentModuleAbility 停止自身并返回结果

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

import common from '@ohos.app.ability.common'

@Entry
@Component
struct Index {
  @State message: string = 'payment module page'
  @StorageProp("orderId") orderId: number = 0

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Text(`${this.orderId}`)
          .fontSize(50)
          .fontColor(Color.Red)

        Button("支付").onClick(() => {
          const context = getContext(this) as common.UIAbilityContext;
          context.terminateSelfWithResult({
            resultCode: 1,
            want: {
              deviceId: '', // deviceId为空表示本设备
              bundleName: 'com.example.myapplications',
              abilityName: 'EntryAbility',
              moduleName: 'entry',
              parameters: {
                isPay: true
              }
            }
          })
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript

【鸿蒙开发】生命周期,鸿蒙,华为,harmonyos,typescript文章来源地址https://www.toymoban.com/news/detail-860391.html

到了这里,关于【鸿蒙开发】生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS鸿蒙原生应用开发设计- 华为分享图标

    HarmonyOS设计文档中,为大家提供了独特的华为分享图标,开发者可以根据需要直接引用。 开发者直接使用官方提供的华为分享图标内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可以防止使用别人的内容产生的侵权意外情况等,减少自主创作华为分享图标的工作量

    2024年02月08日
    浏览(45)
  • 【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇

    ​ 🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\" 目录 HarmonyOS 4.0 技术介绍: HarmonyOS三大特征:     1.实现硬件互助,资源共享。      2. 面向开发者,实现一次开发,多端部署。  3.一套操

    2024年02月05日
    浏览(34)
  • 华为鸿蒙HarmonyOS应用开发者高级认证试题及答案

    判断 1只要使用端云一体化的云端资源就需要支付费用(错) 2所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。(错) 3 HarmonyOS应用可以兼容OpenHarmony生态(对) 4 使用端云一体化开发,无需自己搭建服务器,并进行运维了。(对) 5基于端

    2024年02月04日
    浏览(52)
  • HarmonyOS Stage模型 UIAbility生命周期状态

    UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态 Create 状态,在UIAbility实例 创建 时触发,对应onCreate回调。可以在onCreate回调中进行相关初始化操作 Foreground 状态,在UIAbility 切换至前台 时触发。对应onForeground回调,在UIAbility的UI页面可见之前,即UIAbility切换至

    2024年01月16日
    浏览(33)
  • HarmonyOS(十三)——详解自定义组件的生命周期

    自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。 下图展示的是被@Entry装饰的组件生命周期: 今天根据上面的流程图,我们从自定义组件

    2024年01月25日
    浏览(40)
  • 华为鸿蒙开发(HarmonyOs开发):超详细的:DevEco Studio 的安装和配置 、华为第三方包依赖:SDK软件包的安装、Nodejs的导入配置

    2023年11月28日20:00:00 ⚠️⚠️HarmonyOs 开发工具 ⚠️⚠️ ⚠️⚠️DevEco Studio 的安装和配置⚠️⚠️ ⚠️⚠️⚠️❤️❤️ 关注了解更多 一、打开鸿蒙开发工具官网 下面是安装DevEco Studio 的详细步骤:希望大家给个关注,祝大家:踏上HarmonyOs 之旅,步步高升! 下载地址:官

    2024年02月03日
    浏览(44)
  • HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参

    允许在生命周期函数中使用 Promise 和异步回调函数,比如网络资源获取,定时器设置等; 即被@Entry 装饰的组件生命周期,提供以下生命周期接口: onPageShow 页面加载时触发,页面每次显示时触发一次,包括路由过程、应用进入前台等场景。 onPageHide 从第一个页面跳转第二个

    2024年01月21日
    浏览(31)
  • 【华为鸿蒙】HarmonyOS概述:技术特性

    来源:HarmnyOS 官网 https://developer.harmonyos.com/cn/docs/documentation/doc-guides/harmonyos-features-0000000000011907 多种设备之间能够实现硬件互助、资源共享,依赖的关键技术包括分布式软总线、分布式设备虚拟化、分布式数据管理、分布式任务调度等。 分布式软总线是手机、平板、智能穿戴

    2024年01月21日
    浏览(39)
  • 华为新发布的鸿蒙与目前华为手机的鸿蒙系统有什么差异,OpenHarmony、HarmonyOS、HarmonyOS NEXT的区别详解

    最近工作中需要进行鸿蒙适配,一开始我有个疑问,今年新发布的鸿蒙系统,与目前华为手机使用的鸿蒙系统有什么差异?为什么要专门进行适配?如果大家也有类似的疑问,看完这篇就明白了。 今年华为在鸿蒙生态千帆启航仪式上正式发布了鸿蒙原生操作系统——HarmonyO

    2024年04月17日
    浏览(42)
  • 华为发布 HarmonyOS NEXT 鸿蒙星河版

    在 2024-01-18 下午于深圳举办的鸿蒙生态千帆启航仪式上,华为常务董事兼终端BG CEO余承东宣布了HarmonyOS NEXT(鸿蒙星河版)的开发者预览版面向开发者开放申请。这一版本旨在实现六大极致原生体验,包括原生精致、易用、流畅、安全、智能和互联。 余承东表示,首批鸿蒙原

    2024年01月24日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包