鸿蒙面试-----鸿蒙组件生命周期详解

不同颜色的是必须要会的,黑色的参考一下,只写了一些用过的还有很多组件的生命周期都没写

组件的生命周期有那些?

我了解的有、系统组件的生命周期、页面和自定义组件的生命周期、UIAbility组件的生命周期,Navigation组件生命周期,Web组件生命周期。

就是面试官问你这个问题我们应该怎么答?

我们是一口气把所有的生命周期都说出来,还是按照总分结构说出来?

我会把我认为重要的用不同颜色标注出来

系统组件生命周期

onAppear:组件卸载消失时触发此回调。

onDisAppear:组件挂载显示后触发此回调。

onAttach:组件挂载至组件树时触发此回调。

onDetach:组件从组件树卸载时触发此回调。

不太清楚后面两个算不算生命周期里面的钩子函数,我参考了一个文献,把onAppear和

onDisAppear放在了系统组件生命周期里面。然后这个两个也在同级目录里面。所以也加上来了。按照生命周期的定义来说应该算是 ,如果有误请评论区说一下。谢谢

**生命周期的定义:**即它是描述组件从创建到销毁整个过程中所经历的不同阶段,每个阶段都有相应的回调函数可供开发者使用,以实现诸如初始化数据、更新界面、释放资源等操作,确保组件在应用中能正确且高效地运行。

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

在开始之前,我们先明确自定义组件和页面的关系:

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

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

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

onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。

onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。

onBackPress:当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。

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

aboutToAppear:aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。

onDidBuild:onDidBuild函数在执行自定义组件的build()函数之后执行。

aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁时执行。

@Entry装饰的组件(页面)生命周期。

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

aboutToRecycle:组件的生命周期回调,在可复用组件从组件树上被加入到复用缓存之前调用。

onWillApplyTheme:用于获取当前组件上下文的Theme对象,在创建自定义组件的新实例后,在执行其build()函数之前执行。

UIAbility组件的生命周期

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。

onCreate:UIAbility实例处于完全关闭状态下被创建完成后进入该生命周期回调,执行初始化业务逻辑操作。

onDestroy:UIAbility生命周期回调,在销毁时回调,执行资源清理等操作。

onForeground:UIAbility生命周期回调,当应用从后台转到前台时触发。

onBackground:UIAbility生命周期回调,当应用从前台转到后台时触发。

WindowStageCreate和WindowStageDestroy状态

onWindowStageCreat:当WindowStage创建后调用。

onWindowStageWillDestroy:当WindowStage即将销毁时调用。

onWindowStageDestroy:当WindowStage销毁后调用。

onWindowStageRestore: 当迁移多实例ability时,恢复WindowStage后调用。

onContinue:当Ability准备迁移时触发,保存数据。

onNewWant:UIAbility实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该UIAbility实例时会回调执行该方法。

onDump:转储客户端信息时调用,可用于转储非敏感信息。

onSaveState:该API配合appRecovery使用。在应用故障时,如果使能了自动保存状态,框架将回调onSaveState保存UIAbility状态。

onShare :在跨端分享场景下,在UIAbility中设置分享方设备要分享的数据。

onPrepareToTerminate:UIAbility生命周期回调,当系统预关闭开关打开后(配置系统参数persist.sys.prepare_terminate为true打开),在UIAbility关闭时触发,可在回调中定义操作来决定是否继续执行关闭UIAbility的操作。如果UIAbility在退出时需要与用户交互确认是否关闭UIAbility,可在此生命周期回调中定义预关闭操作配合terminateSelf接口退出,如弹窗确认是否关闭,并配置预关闭生命周期返回true取消正常关闭。

onBackPressed:UIAbility生命周期回调,当UIAbility侧滑返回时触发,根据返回值决定是否销毁UIAbility。

Navigation作为路由容器,其生命周期承载在NavDestination组件上,以组件事件的形式开放。

其生命周期大致可分为三类,自定义组件生命周期、通用组件生命周期和自有生命周期。其中,aboutToAppearaboutToDisappear是自定义组件的生命周期(NavDestination外层包含的自定义组件),OnAppearOnDisappear是组件的通用生命周期。剩下的六个生命周期为NavDestination独有。

aboutToAppear:在创建自定义组件后,执行其build()函数之前执行(NavDestination创建之前),允许在该方法中改变状态变量,更改将在后续执行build()函数中生效。

aboutToDisappear:自定义组件析构销毁之前执行,不允许在该方法中改变状态变量。

onAppear:通用生命周期事件,NavDestination组件挂载到组件树时执行。

onDisappear:通用生命周期事件,NavDestination组件从组件树上卸载销毁时执行。

-------------上面是通用---------------下面是NavDestination独有---------

onWillAppear:NavDestination创建后,挂载到组件树之前执行,在该方法中更改状态变量会在当前帧显示生效。

onWillDisappear:NavDestination组件即将销毁之前执行,如果有转场动画,会在动画前触发(栈顶页面pop出栈)。

onShown:NavDestination组件布局显示之后执行,此时页面已完成布局。

onWillShow:NavDestination组件布局显示之前执行,此时页面不可见(应用切换到前台不会触发)。

onHidden:NavDestination组件触发隐藏后执行(非栈顶页面push进栈,栈顶页面pop出栈或应用切换到后台)。

onWillHide:NavDestination组件触发隐藏之前执行(应用切换到后台不会触发)。

Web组件的生命周期

aboutToAppear函数:在创建自定义组件的新实例后,在执行其build函数前执行。一般建议在此设置WebDebug调试模式setWebDebuggingAccess、设置Web内核自定义协议URL的跨域请求与fetch请求的权限customizeSchemes、设置Cookie(configCookie)等。

onControllerAttached事件:当Controller成功绑定到Web组件时触发该回调,且禁止在该事件回调前调用Web组件相关的接口,否则会抛出js-error异常。推荐在此事件中注入JS对象registerJavaScriptProxy、设置自定义用户代理setCustomUserAgent,可以在回调中使用loadUrl,getWebId等操作网页不相关的接口。但因该回调调用时网页还未加载,因此无法在回调中使用有关操作网页的接口,例如zoomIn、zoomOut等。

onLoadIntercept事件:当Web组件加载url之前触发该回调,用于判断是否阻止此次访问。默认允许加载。

onOverrideUrlLoading事件:当URL将要加载到当前Web中时,让宿主应用程序有机会获得控制权,回调函数返回true将导致当前Web中止加载URL,而返回false则会导致Web继续照常加载URL。onLoadIntercept接口和onOverrideUrlLoading接口行为不一致,触发时机也不同,所以在应用场景上存在一定区别。主要是在LoadUrl和iframe(HTML标签,表示HTML内联框架元素,用于将另一个页面嵌入到当前页面中)加载时,onLoadIntercept事件会正常回调到,但onOverrideUrlLoading事件在LoadUrl加载时不会触发,在iframe加载HTTP(s)协议或about:blank时也不会触发。详细介绍请见onLoadIntercept和onOverrideUrlLoading的说明。

onInterceptRequest事件:当Web组件加载url之前触发该回调,用于拦截url并返回响应数据。

onPageBegin事件:网页开始加载时触发该回调,且只在主frame(表示一个HTML元素,用于展示HTML页面的HTML元素)触发。如果是iframe或者frameset(用于包含frame的HTML标签)的内容加载时则不会触发此回调。多frame页面有可能同时开始加载,即使主frame已经加载结束,子frame也有可能才开始或者继续加载中。同一页面导航(片段、历史状态等)或者在提交前失败、被取消的导航等也不会触发该回调。

onProgressChange事件:告知开发者当前页面加载的进度。多frame页面或者子frame有可能还在继续加载而主frame可能已经加载结束,所以在onPageEnd事件后依然有可能收到该事件。

onPageEnd事件:网页加载完成时触发该回调,且只在主frame触发。多frame页面有可能同时开始加载,即使主frame已经加载结束,子frame也有可能才开始或者继续加载中。同一页面导航(片段、历史状态等)或者在提交前失败、被取消的导航等也不会触发该回调。推荐在此回调中执行JavaScript脚本loadUrl等。需要注意的是收到该回调并不能保证Web绘制的下一帧将反映此时DOM的状态。

onPageVisible事件:Web回调事件。渲染流程中当HTTP响应的主体开始加载,新页面即将可见时触发该回调。此时文档加载还处于早期,因此链接的资源比如在线CSS、在线图片等可能尚不可用。

onRenderExited事件:应用渲染进程异常退出时触发该回调,可以在此回调中进行系统资源的释放、数据的保存等操作。如果应用希望异常恢复,需要调用loadUrl接口重新加载页面。

onDisAppear事件:组件卸载消失时触发此回调。该事件为通用事件,指组件从组件树上卸载时触发的事件。

相关推荐
play_big_knife3 小时前
鸿蒙项目云捐助第三讲鸿蒙App应用的启动页实现
华为·harmonyos·鸿蒙·云开发·鸿蒙开发·鸿蒙next·华为云开发
weixin_524066413 小时前
鸿蒙调试打包(非正式打包)
华为·harmonyos·鸿蒙系统
七七四十九0774 小时前
数据分析岗位求职攻略 —— 常见面试题目及答案
信息可视化·面试·数据分析
摇光~4 小时前
【数据分析岗】关于数据分析岗面试python的金典问题+解答,包含数据读取、数据清洗、数据分析、机器学习等内容
python·面试·数据分析
Kristen Stewart5 小时前
Deveco Studio首次编译项目初始化失败
harmonyos
青瓷看世界7 小时前
华为HarmonyOS帮助应用实现在线认证服务 -- 3 IFAA免密身份认证
人工智能·华为·harmonyos·在线认证
青瓷看世界7 小时前
华为HarmonyOS帮助应用实现在线认证服务 -- 1 业务简介
华为·harmonyos·在线认证
俺不理解7 小时前
Android Compose 悬浮窗
android·生命周期·compose·悬浮窗
高高要努力8 小时前
【面试】java多线程
java·面试