AbilityStage 初始化没等完,首个页面就读到空配置:HarmonyOS 7 onAboutToCreateAbilityAsync 实战
AbilityStage 初始化没等完,首个页面就读到空配置:HarmonyOS 7 onAboutToCreateAbilityAsync 实战
冷启动时首页偶尔把远端开关当成 false,几百毫秒后又突然刷新;深链启动第二个 Ability 时还会重复拉配置。根因是初始化 Promise 没有成为 Ability 创建前的明确门槛。
本文交付:一个 StageBootstrap、共享 Promise、超时降级策略、首页与深链两个案例,以及启动日志字段。。
官方依据与版本边界
官方变更页:https://developer.huawei.com/consumer/cn/doc/doccenter-release-notes/js-apidiff-abilitykit-7003
- AbilityStage 新增 onAboutToCreateAbilityAsync。
- 异步钩子适合在 Ability 创建前完成必要准备。
- 启动准备必须设置超时和降级值。
- 多 Ability 需要共享同一初始化 Promise。
本文依据 HarmonyOS 7.0.0 Release(API 26)官方变更说明梳理接口,并对状态模型、分支选择和异常映射做了宿主侧 TypeScript 测试。当前本机 SDK 为 API 24,且没有连接 HDC 设备,因此不把示例描述为 API 26 编译通过、真机性能数据或上架审核结论。接入前请在 API 26 工程中按文末清单完成编译、设备与回归验证。
复现与验证
- 给远端配置增加 0、500、1500 毫秒三档延迟。
- 分别从桌面图标和菜谱深链冷启动。
- 记录 bootstrapStart、bootstrapEnd、source、abilityName 与 Promise ID。
- 确认多个 Ability 只出现一个 Promise ID。
- 超时后首屏使用缓存,远端结果不能无提示地改掉关键结构。
| 输入/场景 | 预期分支 | 验收信号 |
|---|---|---|
| 远端 500ms | remote | 首屏读取正确 |
| 远端 1500ms | cache | 不无限阻塞 |
| 远端异常 | cache/default | 可启动 |
| 双 Ability | 同一 Promise | 只请求一次 |
| 热启动 | 复用结果 | 无重复加载 |
| 缓存损坏 | default | 记录降级 |

图中的每条箭头都应对应一条可查询日志:输入、平台调用、状态映射、UI 或降级结果。只有 UI 变化而没有中间证据,后续仍然难以区分接口失败和页面逻辑错误。
两种行为不同的案例
案例一:首页冷启动
只等待影响首屏结构的最小配置;推荐列表等非关键数据进入页面后再加载。
案例二:菜谱深链启动
第二个 Ability 复用已开始的 Promise,不重复请求;超时后使用本地快照并记录来源。
可复用的 ArkTS 集成片段
type BootstrapResult = { source: 'remote' | 'cache' | 'default'; flags: Record<string, boolean> }
+
+class StageBootstrap {
+ private task?: Promise<BootstrapResult>
+
+ prepare(): Promise<BootstrapResult> {
+ if (this.task) return this.task
+ this.task = Promise.race([
+ loadRemoteFlags(),
+ new Promise<BootstrapResult>((resolve) => setTimeout(() => resolve(loadCachedFlags()), 1200))
+ ]).catch(() => loadCachedFlags())
+ return this.task
+ }
+}
+
+const bootstrap = new StageBootstrap()
+
+export default class MyAbilityStage extends AbilityStage {
+ async onAboutToCreateAbilityAsync(): Promise<void> {
+ const result = await bootstrap.prepare()
+ AppStorage.setOrCreate('bootstrapFlags', result.flags)
+ AppStorage.setOrCreate('bootstrapSource', result.source)
+ }
+}
代码刻意把平台调用和业务状态分开:平台返回什么就记录什么,页面只消费稳定状态。接入时还应补齐项目的日志域、错误码类型和生命周期释放。
取舍与落地清单
把所有初始化都塞进异步钩子会拖慢启动;完全不等待又会让首屏读取半成品。只把“影响首屏结构且无法安全延迟”的最小集合放进门槛,才是这个 API 的合适边界。
- 已用 API 26 工程编译,并记录 SDK 与设备版本
- 已覆盖“首页冷启动”和“菜谱深链启动”两类行为
- 已记录成功、失败、降级三条路径的输入与结果
- 已核对监听、对象或任务的释放与幂等行为
- 已把本文宿主测试替换为项目自己的真机证据
小结
一个 StageBootstrap、共享 Promise、超时降级策略、首页与深链两个案例,以及启动日志字段。。建议先在最小页面复现,再接入完整“中式美食”流程;先证明状态链正确,再谈动画、缓存或埋点优化。
更多推荐


所有评论(0)