【鸿蒙实战开发】HarmonyOS应用内的生命周期流转

两种生命周期原理与介绍

  1. UIAbility组件生命周期。

UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如在支付应用中,可以将入口功能和收付款功能分别配置为独立的UIAbility。

更多内容可查看:​​Stage模型应用组件​​和​​UIAbility组件​​。

当用户打开,切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。UIAbility的生命周期包括Create,Foreground,Background,Destroy四个状态。
image.png

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

image.png

1. 页面/组件生命周期
Navigation生命周期

image.png

针对一次操作同步销毁和创建同步创建的场景(如replace),遵循以下规则:

− 涉及到页面的生命周期顺序aboutToAppear(外层自定义组件) -> onWillAppear(进场Destination页面) -> onWillHide(退出Destination页面) -> onAppear(进场页面) -> onWillShow(进场页面) -> onHide(退出页面) -> onWillDisAppear(退场页面) -> onShow(进场页面) -> onDisAppear(退场页面) -> aboutToDisAppear(退场页面)。

− 针对willShow和willHide生命周期有2种情形不会触发:前后台切换,router+Navigation混合使用,使用router跳转导致Navigation中的页面隐藏或者显示时不会触发willShow/willHide的流程。

− Dialog场景触发规则遵循show相关的生命周期(onWillShow,onShow)均从栈底到栈顶依次触发,hide相关生命周期(onWillHide,onHide)均从栈顶到栈底依次触发。

− 一次性清理多个页面,触发多个页面销毁(clear),对应的触发流程为栈顶页面最后销毁,堆栈中的其他页面从栈顶到栈底依次触发onHide -> onWillDisAppear -> onDisAppear。

− clear1,2,3页面,组件生命周期执行顺序, 当前页面是3(1). 销毁除当前页面的其他页面:从栈顶向栈底依次触发onHide -> onWillDisAppear -> onDisAppear(2). 销毁当前页面:onHide -> onWillDisAppear -> onDisAppear。

router

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

image.png

可参考:​​生命周期定义​​。

实际场景中生命周期的应用

场景一:启动框架的手动配置时机选择(性能优化)
场景描述以及生命周期钩子选择

场景:启动框架预加载SDK手动配置时选择。

生命周期:UIAbility生命周期的 onCreate() 回调。

方案说明

在UIAbility的onCreate生命周期回调中进行SDK或者任务初始化。

image.png

代码实现
export default class EntryAbility extends UIAbility { 
    Logger.info('Ability onCreate') 
    // 缓存应用状态: context 
    AppStorage.setOrCreate('context', this.context) 
    let startParams = ['StartupTask_005'] 
    try { 
      startupManager.run(startParams).then(() => { 
        Logger.info(`StartupTest startupManager run then, startParams = ${JSON.stringify(startParams)}`) 
      }).catch((error: BusinessError) => { 
        Logger.error(`StartupTest promise catch error, error = ${JSON.stringify(error)}; StartupTest promise catch error, startParams = ${JSON.stringify(startParams)}`) 
      }) 
    } catch (error) { 
      Logger.error(`Startup catch error , err = ${JSON.stringify(error)}`) 
    } 
  //... 
}
场景二:应用状态初始化(定义全局变量等)
场景描述以及生命周期钩子选择

场景:

  1. 将应用状态 EntryAbility中的context和windowStage存储在AppStorage中,以便于其它业务模块使用。

  2. 注册全局字体。

  3. 初始化启动页,欢迎页,广告页。

生命周期:

  1. UIAbility生命周期的 onCreate()回调,

  2. UIAbility生命周期的 onWindowStageCreate()回调。

在onCreate设置 context上下文。在onWindowStageCreate回调中初始化页面,将windowStage储存到AppStorage,windowStage.loadContent加载页面。

核心代码
// 设置全局变量/注册自定义字体  
onWindowStageCreate(windowStage: window.WindowStage): void { 
  Logger.info('Ability onWindowStageCreate') 
  // 缓存应用状态: windowStage 
  AppStorage.setOrCreate('windowStage', windowStage) 
  // 获取应用权限 
  reqPermissionsFromUser(permissions, this.context) 
  // 启动页,广告页,欢迎页加载 
  windowStage.loadContent('pages/Welcome/Welcome', (err) => { 
    if (err.code) { 
      Logger.error(`Failed to load the content, err = ${JSON.stringify(err)}`) 
      return 
    } 
    // 注册全局字体 
    FontRegister.registerCustomFont() 
    Logger.info('Succeeded in loading the content') 
  }) 
}
// 其他模块使用 
import { common } from '@kit.AbilityKit'; 
import { window } from '@kit.ArkUI'; 

@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
  context: common.UIAbilityContext | null = AppStorage.get('context') || null 
  @StorageLink('windowStage') windowStage: window.WindowStage | null = AppStorage.get('windowStage') || null 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值