鸿蒙原生开发手记:徒步迹 - 应用生命周期与AbilityStage
掌握应用级生命周期,构建稳健的鸿蒙应用
一、前言
应用生命周期管理是保证 App 稳定运行的基础。在鸿蒙 Stage 模型中,除了每个 Ability 的生命周期,还提供了 AbilityStage 来管理应用级生命周期事件。
本文将详细介绍鸿蒙应用的生命周期体系,包括 AbilityStage、应用状态保存与恢复、内存管理等关键话题。
二、AbilityStage 详解
AbilityStage 是 Stage 模型中的应用级生命周期入口,类似于 Android 的 Application。
2.1 创建 AbilityStage
// MyAbilityStage.etsimport{AbilityStage,Want}from'@kit.AbilityKit';exportdefaultclassMyAbilityStageextendsAbilityStage{// 应用创建时调用(首次启动)onCreate():void{console.info('[徒步迹] AbilityStage onCreate');// 初始化全局配置this.initGlobalConfig();// 初始化日志系统Logger.init();// 初始化崩溃收集CrashCollector.init();// 预加载数据this.preloadData();}// 多实例模式下,指定实例标识onAcceptWant(want:Want):string{// 根据 Want 参数返回实例 keyif(want.parameters){consttype=want.parameters['instanceType']asstring;if(type==='tracking'){return`tracking_${Date.now()}`;}if(type==='route'){constrouteId=want.parameters['routeId']asnumber;return`route_${routeId}`;}}return`default_${Date.now()}`;}// 配置文件中声明// module.json5 中配置 srcEntry 指向此文件// "srcEntry": "./ets/myabilitystage/MyAbilityStage.ets"privateinitGlobalConfig():void{// 初始化全局存储if(!AppStorage.get('initialized')){AppStorage.setOrCreate('initialized',true);AppStorage.setOrCreate('appVersion','1.0.0');AppStorage.setOrCreate('stepGoal',10000);AppStorage.setOrCreate('themeMode','light');}}privatepreloadData():void{// 预加载必要配置// 例如从 Preferences 读取用户设置console.info('[徒步迹] 预加载完成');}}2.2 配置 module.json5
{ "module": { "name": "entry", "type": "entry", "srcEntry": "./ets/myabilitystage/MyAbilityStage.ets", "abilities": [ { "name": "EntryAbility", "srcEntry": "./ets/entryability/EntryAbility.ets" } ] } }三、应用生命周期完整流程
3.1 启动流程
用户点击图标 ↓ 系统创建 Application Process ↓ AbilityStage.onCreate() ← 应用级初始化 ↓ UIAbility.onCreate() ← 页面级初始化 ↓ UIAbility.onWindowStageCreate() ← 加载页面 ↓ UIAbility.onForeground() ← 用户可见 ↓ 页面 aboutToAppear() ← 页面准备显示 ↓ 应用正常启动完成 ✅3.2 后台运行流程
用户按 Home 键 / 切换到其他 App ↓ UIAbility.onBackground() ← 进入后台 ↓ 页面 aboutToDisappear() ← 页面隐藏 ↓ 系统可能保留或回收进程3.3 回到前台流程
用户从最近任务切回 App ↓ UIAbility.onForeground() ← 回到前台 ↓ 页面 aboutToAppear() ← 重新显示3.4 销毁流程
用户划掉 App / 系统回收 ↓ UIAbility.onWindowStageDestroy() ↓ UIAbility.onDestroy() ← Ability 销毁 ↓ AbilityStage.onDestroy() ← 应用销毁(进程结束)四、应用状态保存与恢复
4.1 保存状态
在 onBackground 中保存关键状态:
exportdefaultclassEntryAbilityextendsUIAbility{onBackground():void{console.info('[徒步迹] 进入后台,保存状态');// 保存页面状态letstepCount=AppStorage.get<number>('stepCount');letdistance=AppStorage.get<number>('todayDistance');// 保存到持久化存储letpreferences=this.context.preferences;preferences.put('stepCount',stepCount??0);preferences.put('todayDistance',distance??0);preferences.flush();}}4.2 恢复状态
在 onCreate 或 onForeground 中恢复:
exportdefaultclassEntryAbilityextendsUIAbility{asynconForeground():Promise<void>{console.info('[徒步迹] 回到前台,恢复状态');// 从持久化存储恢复letpreferences=this.context.preferences;letsavedSteps=awaitpreferences.get('stepCount',0);letsavedDistance=awaitpreferences.get('todayDistance',0);AppStorage.setOrCreate('stepCount',savedSteps);AppStorage.setOrCreate('todayDistance',savedDistance);}}4.3 配置异常恢复
// module.json5 配置恢复策略 { "abilities": [ { "name": "EntryAbility", "launchType": "singleton", "recovery": { "enabled": true, // 启用异常恢复 "maxRecoveryCount": 3, // 最大恢复次数 } } ] }五、页面生命周期
除了 Ability 生命周期,每个页面也有自己的生命周期:
@Entry@Componentstruct HomePage{// 页面即将显示aboutToAppear():void{console.info('[徒步迹] HomePage aboutToAppear');// 加载数据、初始化状态this.loadTodayData();}// 页面即将消失aboutToDisappear():void{console.info('[徒步迹] HomePage aboutToDisappear');// 释放资源、保存临时状态}// 页面尺寸变化(如折叠屏展开)onPageHide():void{console.info('[徒步迹] HomePage onPageHide');}// 页面重新显示onPageShow():void{console.info('[徒步迹] HomePage onPageShow');// 刷新数据this.refreshData();}// 返回键处理onBackPress():boolean{console.info('[徒步迹] HomePage onBackPress');// 返回 true 表示拦截返回事件returnfalse;}build(){// ...}}六、内存与进程管理
6.1 内存警告
应用可以监听系统内存警告,及时释放资源:
exportdefaultclassEntryAbilityextendsUIAbility{// 系统内存不足时调用onMemoryLevel(level:number):void{if(level===MemoryLevel.MEMORY_LEVEL_MODERATE){// 中等内存压力:释放缓存ImageCache.clear();}elseif(level===MemoryLevel.MEMORY_LEVEL_CRITICAL){// 严重内存压力:释放所有非必要资源this.releaseAllResources();}}privatereleaseAllResources():void{AppStorage.delete('cachedRoutes');AppStorage.delete('cachedPhotos');}}6.2 配置进程优先级
// module.json5 { "module": { "name": "entry", "process": "com.hiking.tuji", "keepAlive": true // 后台定位场景需保持活跃 } }七、实践建议
7.1 初始化顺序
exportdefaultclassMyAbilityStageextendsAbilityStage{onCreate():void{// 第1步:日志系统Logger.init();// 第2步:崩溃收集CrashCollector.init();// 第3步:全局配置ConfigManager.init();// 第4步:数据库DatabaseManager.init();// 第5步:用户信息UserManager.init();}}7.2 资源释放检查清单
□ 取消网络请求 □ 停止定时器 □ 释放图片缓存 □ 关闭数据库连接 □ 停止位置监听 □ 注销事件监听八、总结
应用生命周期管理是 App 稳定性的基础。通过 AbilityStage 进行应用级初始化,通过 UIAbility 生命周期管理页面状态,通过页面生命周期控制 UI 行为,形成了一个完整的生命周期管理体系。
第一阶段(项目搭建与语言基础)到此全部完成。从下一篇文章开始,我们将正式进入"徒步迹"核心页面的实战开发。
下一篇预告:鸿蒙原生开发手记:徒步迹 - 启动页(Splash)设计与实现