【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十六)

课程地址: 黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发

(本篇笔记对应课程第 25 - 26 节)

P25《24.Stage模型-UIAblity生命周期》

stage之所以叫这个名字,是因为它在运行时,会提供一个 AbilityStage 的舞台,这个舞台就是用来展示Ablity的,最常见的就是UIAbility,UIAbility就是UI界面的组件,它会提供绘制界面的窗口,将来在这个窗口绘制应用界面,应用就展示出来了。

微信目前还没有鸿蒙版本,先以微信举个例子:

微信的核心功能是社交,是核心功能肯定要放在入口Ability中。但其它非核心功能像视频号、看一看等,显然不应该再放在入口Ability中,它们应该有自己对应的Ability。点击 视频号进入视频号时,底层做了很多事情,创建了一个新的Ability,怎么验证呢?

在这里插入图片描述

进入视频号后,发现任务列表里会有 微信和视频号两个任务,在任务列表中每一个任务代表的就是一个独立的Ability。一个stage同一时间只能展示一个Ability,当点击视频号时,微信主功能Ability就进入了“幕后”,当点击切换回微信主功能时,其对应的 Ability 会再次切换回到舞台上。

在这里插入图片描述

在这里插入图片描述

值得注意的是,windowStage 也加入 UIAbility 的生命周期了(官方文档中WindowStage的钩子函数并不算UIAbility的生命周期函数):

在这里插入图片描述

进入 入口模块的 Ablity,会看到生命周期方法在这里被定义了:

在这里插入图片描述

生命周期钩子方法中配置默认加载了 pages/Index 页面,这就是为什么应用打开默认进入首页。可以在这里修改应用进入后默认加载的页面:

在这里插入图片描述

hilog是harmony提供的可以打印各种级别日志的API。

info()方法的第一个参数是一串16进制的数字,可以理解为一个用来标识的参数,将来在不同模块中可以用不同的标识数字,将来查看日志时可以根据这些标识,比较方便。

第二个参数是一个tag,也可以理解为标识功能,可以表示某个模块下某个功能对应的日志;

第三个参数是日志输出的内容,是一个字符串模板,{}中间是一个占位符,内容取决于第四个参数传递的内容。这个占位符还可以标记其对应内容是否公开,可以是public或private。如果是private,这些日志输出时就会隐藏起来。

在这里插入图片描述

查看日志时可以根据关键字进行过滤:

在这里插入图片描述

重新部署程序并查看打印日志:

在这里插入图片描述

切换到桌面:

在这里插入图片描述

在任务列表中将任务再激活:

在这里插入图片描述

按返回按钮退出应用:

在这里插入图片描述

这些就是UIAbility 生命周期的全部过程:

在这里插入图片描述

P26《25.Stage模型-页面及组件生命周期》

应用一启动,首先就会准备好一个Ability的舞台,在这个“舞台”上会去创建一个 UIAbility 的实例,接着会去初始化 windowStage 的一个舞台,在 windowStageCreate 钩子函数中,可以拿到 windowStage 并利用它去加载和渲染页面。那么页面和组件加载与渲染的过程是怎样的?这一节我们就来看一下页面及组件的生命周期。

在这里插入图片描述

如上图,onPageShow、 onPageHide、 onBackPress 这三个钩子函数是页面生命周期函数,页面的展示肯定是从入口组件开始的,所以这三个钩子函数只能在入口组件中使用,即使用 @Entry 装饰器的组件中。普通的自定义组件中是不能使用的。
aboutToAppear、aboutToDisappear 这两个和组件相关的生命周期钩子是组件创建之后与显示之前、组件即将销毁之前的钩子函数,在入口组件与普通组件中都可以使用。

首页中增加两个页面导航:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在首页中新增以下生命周期钩子:

在这里插入图片描述

lifeCirclePage 文件中也增加如下这5个生命周期钩子:

在这里插入图片描述

myText 子组件中也增加这5个生命周期钩子,注意,这个子组件非入口文件,是没有 onPageShow、 onPageHide、 onBackPress 这三个页面相关的生命周期钩子函数的,我们写上的目的是测试一下是否能触发。

存疑:MyText子组件中从父组件接收的变量 message 与 index 为什么不用@Prop修饰?

在这里插入图片描述

testPage1 与 testPage2 也加上:

在这里插入图片描述
在这里插入图片描述

进入首页,发现打印日志如下:

在这里插入图片描述

点击跳转生命周期测试页面,打印日志如下。由于点击跳转页面默认是页面栈的push模式,所以首页并没有销毁,而是隐藏了。

在这里插入图片描述

点击切换显示,打印出MyText子组件创建与销毁,因为它不是页面组件,所以与页面相关的3个生命周期钩子不起作用,写了也没用。

在这里插入图片描述

点击增删按钮操作数组数据:此时发现仅仅删除了1个元素,却触发了3次组件销毁,且之后又触发了2次组件创建,这是因为删除了一个元素,页面将所有元素都删除了,又将不该删除的元素重新创建了出来。

怎样避免这种情况?需要用到ForEach函数的第三个参数来为每个循环渲染的元素添加key值。

在这里插入图片描述

点击模拟器上的返回按钮:页面返回时,页面栈顶部的页面(当前页面)会被销毁,栈顶页面对应的组件会被全部销毁:

在这里插入图片描述

进入 TestPage1 页面:

在这里插入图片描述

push方式跳转 TestPage2 页面:

在这里插入图片描述

再由 push 跳转回 TestPage1 页面:push模式没有组件的创建和销毁,只有组件的隐藏和显示:

在这里插入图片描述

replace 方式跳转到 TestPage2 页面:

在这里插入图片描述

可见replace模式伴随的是组件的销毁与重新创建,这是需要消耗一定性能的。所以除非某个页面退出时再也不需要了,大多数情况下推荐使用push模式。

总结:
5个生命周期钩子:
1、aboutToAppear : 组件创建之后、build函数执行之前触发。可以在这里做一些数据初始化准备工作。数据准备好后build函数渲染时就可以用这些数据;
2、onPageShow、onPageHide、onBackPress : 页面显示、隐藏与页面点击返回时,可以在这里处理功能性逻辑;
3、aboutToDisappear : 组件即将被销毁前,可以做一些关键数据保存或资源释放类的工作。

实践:

在这里插入图片描述

解决方式参考:https://developer.huawei.com/consumer/cn/forum/topic/0203136657756744585
解决方式参考

在这里插入图片描述

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值