鸿蒙:生命周期

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

指南:文档中心

api:文档中心

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

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。

  • onBackPress:当用户点击返回按钮时触发。

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

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

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

import { Theme } from '@ohos.arkui.theme';

@Entry
@Component
struct LifeCycleCase {
  @State message: string = 'Hello World';

  aboutToAppear(): void {
    // aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。
    // 允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。
    console.log('生命周期', 'aboutToAppear');
  }

  @State primary: string = '#000'

  onWillApplyTheme(theme: Theme): void {
    //onWillApplyTheme函数用于获取当前组件上下文的Theme对象,在创建自定义组件的新实例后,在执行其build()函数之前执行。
    // 允许在onWillApplyTheme函数中改变状态变量,更改将在后续执行build()函数中生效。
    // 在EntryAbility修改默认主题颜色
    this.primary = theme.colors.fontPrimary as string
    console.log('生命周期', 'onWillApplyTheme', theme.colors.fontPrimary);
  }

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('LifeCycleCaseHelloWorld')
        .fontSize(50)
        .fontColor(this.primary)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }

  onDidBuild(): void {
    //onDidBuild函数在执行自定义组件的build()函数之后执行。
    // 不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
    // 可以理解为build执行完了,但是页面还没渲染
    console.log('生命周期', 'onDidBuild');
  }

  onPageShow(): void {
    //页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。
    console.log('生命周期', 'onPageShow');
  }

  onPageHide(): void {
    //页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。
    console.log('生命周期', 'onPageHide');
  }

  onBackPress(): boolean | void {
    //当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。
    // 返回true表示页面自己处理返回逻辑,不进行页面路由;
    // 返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理。
    console.log('生命周期', 'onBackPress');
  }

  aboutToReuse(): void {
    // 当一个可复用的自定义组件从复用缓存中重新加入到节点树时,触发aboutToReuse生命周期回调,并将组件的构造参数传递给aboutToReuse。
  }
}

2. UIAbility生命周期

文档中心

文档中心

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

export default class EntryAbility extends UIAbility { 
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // UIAbility实例处于完全关闭状态下被创建完成后进入该生命周期回调,执行初始化业务逻辑操作。
    // 即UIAbility实例冷启动时进入该生命周期回调。同步接口,不支持异步回调。
    console.log('UIAbility生命周期', 'onCreate');
  }

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// UIAbility实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该UIAbility实例时会回调执行该方法。即UIAbility实例热启动时进入该生命周期回调。
// 例如调转到一个har页面,但退出了,在跳转到这个har页面,会触发。
    AppStorage.set('price', want.parameters!.price)
  }

  // windowStage:窗口管理器。管理各个基本窗口单元,即Window实例。
 // UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。
 // WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 当WindowStage创建后调用。
    console.log('UIAbility生命周期', 'onWindowStageCreate');

    class BlueColors implements CustomColors {
      fontPrimary = '#ff00ff0f'
    }

    class PageCustomTheme implements CustomTheme {
      colors?: CustomColors;

      constructor(colors: CustomColors) {
        this.colors = colors;
      }
    }

    const BlueColorsTheme = new PageCustomTheme(new BlueColors())
    ThemeControl.setDefaultTheme(BlueColorsTheme)
}

  onWindowStageWillDestroy(windowStage: window.WindowStage): void {
    // 当WindowStage即将销毁时调用。在WindowStage销毁前执行,此时WindowStage可以使用。
    console.log('UIAbility生命周期', 'onWindowStageWillDestroy');
  }

  onWindowStageDestroy(): void {
    // 当WindowStage销毁后调用。
    console.log('UIAbility生命周期', 'onWindowStageDestroy');
  }

// Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。
  onForeground(): void {
 // 当应用从后台转到前台时触发, 
// 可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。
    console.log('UIAbility生命周期', 'onForeground');
  }

onBackground(): void {
    // UIAbility从前台切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
    console.log('UIAbility生命周期', 'onBackground');
  }

 onPrepareToTerminate(): boolean {
    //在UIAbility关闭时触发, 是否执行UIAbility关闭操作,
    //返回true表示本次UIAbility关闭流程取消,不再退出,返回false表示UIAbility继续正常关闭。
// 可以在这里做退出提示
// https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-app-ability-uiability-V5#uiabilityonpreparetoterminate10
    console.log('UIAbility生命周期', 'onPrepareToTerminate');
    return false
  }

 onBackPressed(): boolean {
    // 当UIAbility侧滑返回时触发,根据返回值决定是否销毁UIAbility。
    // 返回true表示UIAbility将会被移到后台不销毁,返回false表示UIAbility将正常销毁。
// 退出时销毁了相当于重新打开应用
    console.log('UIAbility生命周期', 'onBackPressed');
    return true
  }

  onDestroy(): void {
    // Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作
    // 例如调用terminateSelf()方法停止当前UIAbility实例,从而完成UIAbility实例的销毁;
    // 或者用户使用最近任务列表关闭该UIAbility实例,完成UIAbility的销毁。
    console.log('UIAbility生命周期', 'onDestroy');
  }

// 除以上常用生命周期外,还有以下生命周期
// onWindowStageRestore: 当迁移多实例ability时,恢复WindowStage后调用。
// onContinue: 当Ability准备迁移时触发,保存数据。
// onDump: 转储客户端信息时调用,可用于转储非敏感信息。
// onSaveState: 该API配合appRecovery使用。在应用故障时,如果使能了自动保存状态,框架将回调onSaveState保存UIAbility状态。
//  onShare: 在跨端分享场景下,在UIAbility中设置分享方设备要分享的数据。

}

3. 卡片生命周期

 文档中心

文档中心

未完

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值