两种生命周期原理与介绍
- UIAbility组件生命周期。
UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如在支付应用中,可以将入口功能和收付款功能分别配置为独立的UIAbility。
更多内容可查看:Stage模型应用组件和UIAbility组件。
当用户打开,切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。UIAbility的生命周期包括Create,Foreground,Background,Destroy四个状态。
UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载,设置WindowStage的事件订阅。
1. 页面/组件生命周期
Navigation生命周期
针对一次操作同步销毁和创建同步创建的场景(如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
自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。
可参考:生命周期定义。
实际场景中生命周期的应用
场景一:启动框架的手动配置时机选择(性能优化)
场景描述以及生命周期钩子选择
场景:启动框架预加载SDK手动配置时选择。
生命周期:UIAbility生命周期的 onCreate() 回调。
方案说明
在UIAbility的onCreate生命周期回调中进行SDK或者任务初始化。
代码实现
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)}`)
}
//...
}
场景二:应用状态初始化(定义全局变量等)
场景描述以及生命周期钩子选择
场景:
-
将应用状态 EntryAbility中的context和windowStage存储在AppStorage中,以便于其它业务模块使用。
-
注册全局字体。
-
初始化启动页,欢迎页,广告页。
生命周期:
-
UIAbility生命周期的 onCreate()回调,
-
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