1️⃣ 基本概念
| 类型 | 定义 |
|---|---|
| 冷启动(Cold Start) | 应用或 Ability 从未在内存中存在,需要 创建进程、加载 HAP、初始化 UIAbility 和 WindowStage |
| 热启动(Hot Start) | 应用或 Ability 已在内存中存在,复用现有实例和 WindowStage 页面栈,无需重复加载 HAP 或初始化资源 |
✅ 核心:冷启动涉及进程和 HAP 初始化,热启动只需恢复已有状态
2️⃣ Stage 模型下的区分逻辑
-
Ability 级别
-
冷启动:UIAbility 或 ServiceAbility 不存在进程/实例
- 系统执行
onCreate()→onWindowStageCreate()→ 初始化页面栈
- 系统执行
-
热启动:UIAbility 已存在于内存
- 系统调用
onForeground()→ WindowStage 页面栈直接显示 - 页面状态保持,无需重新创建页面
- 系统调用
-
-
WindowStage / 页面栈级别
-
冷启动:
- WindowStage 和 Page 栈需要完全创建
- 页面状态初始化
-
热启动:
- 复用 WindowStage,直接显示栈顶页面
- 页面状态可通过缓存或序列化恢复
-
-
HAP 加载
-
冷启动:
- Entry + Feature HAP 可能被动态加载
- UIAbility 和 ServiceAbility 都需初始化
-
热启动:
- 所需 HAP 已加载,无需重复解压和初始化
-
3️⃣ Stage 模型特性对冷/热启动的优化
| 特性 | 优化策略 | 作用 |
|---|---|---|
| WindowStage 独立页面栈 | 热启动复用页面栈,不重新渲染 | 加快页面显示,减少资源占用 |
| HAP 模块化 / 按需加载 | 冷启动按需加载 Feature HAP | 减少初始包体积,优化冷启动速度 |
| Ability 生命周期管理 | 热启动只触发 onForeground(),避免重复初始化 | 避免重复对象创建、网络请求或数据库初始化 |
| UI缓存机制 | 页面可保留状态或序列化恢复 | 提升用户体验,页面显示快速 |
4️⃣ 冷/热启动判定策略
开发者可以通过以下方式判断:
-
系统回调判断
onCreate()→ 冷启动onForeground()→ 热启动
-
WindowStage 页面栈检查
- 页面栈为空 → 冷启动
- 页面栈存在 → 热启动
-
HAP加载状态
- HAP 未加载 → 冷启动
- HAP 已加载 → 热启动
5️⃣ 工程实践建议
-
冷启动优化:
- Entry HAP 尽量轻量,延迟加载 Feature
- UIAbility 初始化逻辑拆分,延迟非必要资源加载
-
热启动优化:
- 保留 WindowStage 页面栈
- 页面状态序列化/缓存,提高恢复速度
- 避免重复网络请求或资源初始化
-
跨 HAP / 跨 Ability 热启动:
- 利用 AbilityManager + WindowStage 复用已加载 Ability
- 参数传递尽量轻量化
🔹 总结
| 区分维度 | 冷启动 | 热启动 |
|---|---|---|
| Ability 是否存在 | 不存在 → 创建 | 已存在 → 复用 |
| WindowStage 页面栈 | 需新建 | 可复用 |
| HAP 加载 | 动态加载或初始化 | 已加载 |
| 生命周期回调 | onCreate() → onWindowStageCreate() → onForeground() | onForeground() |
| 优化策略 | 延迟加载 HAP / 页面 / 资源 | 页面栈复用 / 状态恢复 / 避免重复初始化 |
✅ 核心理解:冷启动 = 从零开始创建进程 + Ability + WindowStage + 页面栈;热启动 = 内存复用,只触发前台回调与页面显示