鸿蒙考试-Ability生命周期篇
一、Ability生命周期核心总结
Page Ability 生命周期流程图
关键回调详解
回调方法 | 触发场景 | 典型用途 |
---|---|---|
onInit() | Ability实例创建时 | 初始化变量、注册监听 |
onReady() | UI加载完成时 | 动态修改UI布局 |
onShow() | 页面从后台切换到前台 | 恢复动画、刷新数据 |
onHide() | 页面被完全遮挡(如跳转新页面) | 暂停耗时操作 |
onActive() | 页面获得焦点(如解锁屏幕) | 恢复传感器服务 |
onInactive() | 页面失去焦点(如弹出对话框) | 暂停视频播放 |
onBackPress() | 用户点击返回键 | 拦截返回操作(返回true可阻止退出) |
onDestroy() | 页面销毁时 | 释放资源、注销监听 |
特殊规则:
- 首次启动顺序:
onInit
→onReady
→onShow
→onActive
- 按返回键退出:
onBackPress
→onInactive
→onHide
→onDestroy
- 切换到后台:
onInactive
→onHide
(不会触发onDestroy)
二、分题型预测题(每类10道)
1. 单选题(10道)
-
当Ability首次创建时,第一个执行的生命周期方法是?
A. onReady
B. onShow
C. onInit
D. onActive -
需要在UI布局完成后动态添加组件,应重写哪个方法?
A. onInit
B. onReady
C. onShow
D. onActive -
用户按下返回键时触发哪个回调?
A. onHide
B. onDestroy
C. onBackPress
D. onInactive -
页面被系统对话框遮挡时,会触发哪个状态?
A. onHide
B. onInactive
C. onDestroy
D. onShow -
下列哪种场景不会触发
onDestroy
?
A. 调用terminateSelf()
B. 从最近任务列表划掉应用
C. 按Home键切换到后台
D. 代码中关闭Ability -
从后台切换回前台时,生命周期顺序是?
A. onShow → onActive
B. onShow → onActive(若之前未失去焦点)
C. onInit → onReady
D. onActive → onShow -
需要释放数据库连接时,应重写哪个方法?
A. onHide
B. onBackPress
C. onDestroy
D. onInactive -
拦截返回键操作需在哪个方法中返回
true
?
A. onHide
B. onBackPress
C. onDestroy
D. onInactive -
页面跳转到其他Ability时,当前页面触发?
A. onInactive → onHide
B. onBackPress → onDestroy
C. onActive → onShow
D. 无变化 -
屏幕锁定后解锁,页面触发?
A. onShow
B. onActive
C. onReady
D. onInit
2. 判断题(10道)
onReady()
在每次页面显示时都会调用。 (×,仅首次加载)- 按Home键退出应用会触发
onDestroy()
。 (×,触发onInactive→onHide
) onActive()
和onInactive()
可能成对触发多次。 (√,如弹窗出现/消失)onBackPress()
返回false
表示不拦截返回操作。 (×,返回true
才拦截)- 页面被全屏视频覆盖时触发
onHide()
。 (√) onInit()
适合执行网络请求操作。 (×,应放在onShow
或异步任务)- 系统杀死进程前一定会调用
onDestroy()
。 (×,低内存时可能直接终止) onShow()
在从后台切换到前台时触发。 (√)- 两个Ability切换时会同时处于
onActive
状态。 (×,同一时间只有一个Active) onDestroy()
中必须手动释放所有资源。 (√)
3. 简答题(10道预测)
-
简述首次启动Ability的生命周期流程
答案:
onInit
(初始化)→onReady
(UI就绪)→onShow
(页面显示)→onActive
(获取焦点) -
onHide()
和onDestroy()
的区别是什么?答案:
onHide
是页面被遮挡(仍存在内存中),onDestroy
是页面被销毁释放资源 -
如何阻止用户点击返回键退出页面?
答案:重写
onBackPress()
并返回true
-
在哪个生命周期恢复动画播放?为什么?
答案:
onActive
,此时页面获得焦点且对用户可见 -
解释
onInactive()
的典型使用场景答案:暂停实时操作(如GPS定位、视频播放),避免资源浪费
-
页面跳转时生命周期如何变化?
答案:当前页:
onInactive
→onHide
;新页面:onInit
→onReady
→onShow
→onActive
-
为什么要在
onDestroy()
中释放资源?答案:防止内存泄漏(如未关闭的数据库连接、未注销的监听器)
-
从后台返回前台可能触发哪些回调?
答案:若进程未销毁:
onShow
→onActive
;若进程被重建:完整生命周期 -
onReady()
和onShow()
执行顺序的必然性答案:
onReady
在UI首次加载后执行,onShow
在页面显示时执行,因此onReady
早于onShow
-
设计一个需要拦截返回键的场景(示例)
答案:用户正在填写表单,点击返回键时弹出提示“是否保存草稿?”
4. 程序填空题(2道示例)
题目1:补全生命周期方法
// 实现退出时保存数据的Ability
export default class MainAbility extends Ability {onInit() {// 初始化数据}onReady() {// 动态加载UI组件}__________ { // 补全方法名:返回键拦截prompt.showDialog({ message: "确认退出?" });return true; // 拦截返回}__________ { // 补全方法名:释放资源data.saveToLocal(); // 保存数据}
}
// 答案:onBackPress, onDestroy
题目2:状态管理结合生命周期
@Entry
@Component
struct MyPage {@State count: number = 0;__________ { // 页面显示时启动计时器setInterval(() => { this.count++ }, 1000);}__________ { // 页面隐藏时清除计时器clearInterval(this.timerId);}build() { ... }
}
// 答案:onShow(), onHide()(需在Ability中定义)
三、高频考点冲刺口诀
“初始(Init)就绪(Ready)显示(Show),活跃(Active)获焦点;
失焦(Inactive)隐藏(Hide)待后台,返回(BackPress)销毁(Destroy)终离别”