这篇文章专门讲独立 Flutter 应用在鸿蒙上的生命周期-从 FlutterAbility 启动到销毁,每个回调什么时候触发、框架帮你干了什么、你该在哪里做什么...如果你用的是 Add-to-App,可以期待下次的讲解-Part2
什么是独立 Flutter 应用?
你通过 flutter create 生成出来的标准工程就是独立 Flutter 应用:整个 App 就是一个 Flutter,不存在"一部分原生、一部分 Flutter"的混合结构。
应用入口长这样:
export default classEntryAbilityextendsFlutterAbility{ // 你的代码}
FlutterAbility 继承自鸿蒙原生的 UIAbility,也就是说,它走的还是标准 UIAbility 生命周期,区别在于,FlutterAbility 在标准回调里塞进了 Flutter 引擎的创建、渲染控制和销毁逻辑,你不需要手动管理引擎,大多数情况下只需要关心业务层的事就可以了
完整的生命周期
你可以结合UIAbility组件生命周期加深理解
逐一拆解每个回调
先上代码
import { AbilityConstant, Want } from '@kit.AbilityKit';import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos';...export default class EntryAbility extends FlutterAbility { ... // ——— 生命周期回调 ——— onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { super.onCreate(want, launchParam) // 执行一次性启动逻辑 } onForeground(): void { super.onForeground() // 恢复 } onBackground(): void { super.onBackground() // 停止 } onWindowStageDestroy(): void { super.onWindowStageDestroy() // 注销 } onDestroy(): void { // 保存数据、释放资源、关闭连接 — 在 super 之前 super.onDestroy() // 最后销毁引擎 }}
触发时机onCreate() — 仅一次
Ability 实例首次创建时触发,整个 App 生命周期里只会走一次。
框架在这里完成了 FlutterManager 注册,FlutterManager 是个全局管理器,负责跟踪当前活跃的 Ability 和 WindowStage,后面的引擎创建、插件上下文解析都依赖它。
触发时机onWindowStageCreate()
UICability 实例创建完成后、进入前台之前触发,系统传进个 window.WindowStage 对象,同时框架在这里做了两件关键的事:
触发时机onForeground() — UI 可见之前
App 从后台切到前台时触发,时机在 UI 变为可见之前,框架恢复了 Flutter 引擎渲染,也就是之前在 onBackground 里暂停的渲染管线被拉起来了。
你在这里应该做的事:
触发时机onBackground() — UI 完全不可见之后
App 切到后台、UI 完全不可见之后触发,框架暂停了 Flutter 引擎渲染。
onBackground() 执行时间很短:系统不会给你太多时间,那些耗时操作得扔到子线程或者异步去处理
触发时机onWindowStageDestroy()
UIAbility 实例销毁前触发。框架在这里注销 WindowStage、释放窗口相关资源。
触发时 WindowStage 已经被销毁了。注意——这个回调里不能再使用 WindowStage 对象,它已经不可用了。你在这里释放的是"通过 WindowStage 获取的自定义资源"——比如在 onWindowStageCreate 里注册的 windowStageEvent 回调。
关键onDestroy() — 最后一个回调
UIAbility 生命周期里收到的最后一个回调,框架在这里销毁 Flutter 引擎和 FlutterView。
onDestroy:需要先完成你的清理,最后调 super.onDestroy()原因是super.onDestroy() 里会销毁引擎:如果你先调了 super,引擎没了,后面你想保存插件状态、写文件、关闭数据库连接都来不及。所以逻辑一定是先完成你的收尾工作,最后让框架销毁引擎...
感兴趣的小伙伴记得关注我,关注社区动态!
https://gitcode.com/CPF-Flutter
“AI再牛,技术不能丢”