一、鸿蒙应用模型的演进
原生JS ---->JQuery---->MVVM的技术演变
- 问题引入:
-
- “我们开发一个鸿蒙应用,代码的入口在哪里?”
- “应用是如何被系统管理的?界面、数据、后台任务如何协同?”
- “为什么现在官方文档和新项目都推荐使用Stage模型?”
- 历史背景:
-
- FA (Feature Ability) 模型:鸿蒙早期(1.0/2.0)的应用模型,借鉴了Android的四大组件思想,概念相对复杂,组件间通信(IPC)开销较大。
- Stage模型:从鸿蒙3.0开始主推的新一代应用模型。它借鉴了现代前端框架(如React/Vue)和微内核思想,核心是“Ability” + “WindowStage” + “Context” ,结构更清晰、性能更优、扩展性更强。
- 核心结论:
-
- FA模型已逐步被弃用。新项目开发必须使用Stage模型。
- 本课程将聚焦于当前和未来的标准——Stage模型。
二、 为什么选择Stage模型?
| 对比维度 | FA模型 (旧) | Stage模型 (新/推荐) | 优势总结 |
|---|---|---|---|
| 设计理念 | 以“功能组件”(Ability)为中心,强耦合 | 以“应用阶段”(Stage)为中心,分层解耦 | 解耦性高,职责更清晰。 |
| 组件通信 | 大量依赖Want进行跨Ability通信,IPC开销大 | Ability内通过Context共享,跨Ability通信更高效 | 性能更优,减少不必要的跨进程调用。 |
| 资源管理 | 资源管理分散,配置复杂 | 资源管理集中(resources目录),通过Resource类统一访问 | 开发更便捷,维护性好。 |
| 生命周期 | Ability生命周期复杂,与UI耦合 | UIAbility生命周期清晰,WindowStage管理UI呈现 | 逻辑更清晰,UI与业务逻辑分离更彻底。 |
| 扩展性 | 扩展性受限,多窗口支持弱 | 原生支持多窗口、自由流转、服务卡片等新特性 | 面向未来,是鸿蒙分布式能力的基础。 |
| 开发体验 | 配置繁琐,代码分散 | 配置集中(module.json5),代码组织更现代化 | 学习曲线更平滑,更符合现代开发习惯。 |
强调:选择Stage模型不是“可选项”,而是开发鸿蒙应用的唯一正确路径。它为应用的性能、可维护性和未来扩展性奠定了坚实基础。
三、 Stage模型核心组件深度解析
Stage模型的核心可以概括为一个公式:Application -> Ability -> WindowStage -> UI。
(一) UIAbility:应用能力的基石
1. 定义:
UIAbility 是Stage模型中承载用户界面和交互逻辑的核心组件。一个应用可以有多个UIAbility(如主页面、设置页、分享页)。
2. 核心职责:
- 生命周期管理:系统通过回调方法管理其状态。
-
onCreate(): Ability被创建时调用。关键点:在此处可以进行一些全局初始化(如数据准备、服务注册),但不要做耗时操作。onWindowStageCreate(windowStage: WindowStage): UI呈现的起点。当系统为该Ability创建好WindowStage后调用。核心任务:在此方法中通过windowStage.loadContent('pages/Index')加载指定的页面内容。onWindowStageDestroy(): UI销毁时调用。进行资源释放。onDestroy(): Ability被销毁时调用。进行最终的清理工作。onForeground(): Ability转到前台时调用(如从后台切回)。onBackground(): Ability转到后台时调用。
UIAbility首次启动生命周期示意图
UIAbility前后台切换时的生命周期执行流程
- 数据与服务承载:可以持有应用数据、启动后台服务、管理数据库连接等。
- 跨Ability通信:作为通信的端点。
- 代码示例 (
MainAbility.ts):
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';
const TAG: string = '[Example] MainAbility';
export default class MainAbility extends UIAbility {
// 1. Ability创建
onCreate(want, launchParam) {
hilog.info(0x0000, TAG, 'onCreate');
// 可以进行初始化,但避免耗时
}
// 2. WindowStage创建 - UI加载的关键
onWindowStageCreate(windowStage: window.WindowStage) {
hilog.info(0x0000, TAG, 'onWindowStageCreate');
// 设置WindowStage的事件监听(可选)
windowStage.on('windowStageFocus', () => {
hilog.info(0x0000, TAG, 'WindowStage focused');
});
// 3. 加载页面内容 - 核心!
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
hilog.error(0x0000, TAG, 'Failed to load the content, err: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, TAG, 'Succeeded in loading the content, data: %{public}s', JSON.stringify(data) ?? '');
});
}
onWindowStageDestroy() {
hilog.info(0x0000, TAG, 'onWindowStageDestroy');
// UI销毁,释放UI相关资源
}
onDestroy() {
hilog.info(0x0000, TAG, 'onDestroy');
// Ability销毁,进行最终清理
}
onForeground() {
hilog.info(0x0000, TAG, 'onForeground');
}
onBackground() {
hilog.info(0x0000, TAG, 'onBackground');
}
}
(二) Context:应用的“万能钥匙”
1. 定义:
Context是应用或Ability的上下文环境,提供了访问应用资源、启动Ability、访问数据库、获取系统服务等能力的统一入口。
2. 获取方式
-
- 在
UIAbility中:通过this.context获取。 - 在页面(
@Entry组件)中:通过getContext(this)获取。
- 在
3. 核心用途
-
- 启动Ability:
context.startAbility(want)。 - 访问资源:
context.resourceManager.getString($r('app.string.app_name').id)。 - 获取应用信息:
context.abilityInfo.bundleName,context.abilityInfo.name。 - 访问文件系统:
context.filesDir,context.cacheDir。 - 获取系统服务:
context.getResourceManager(),context.getApplicationInfo()。
- 启动Ability:
(三) 3. WindowStage 与 Window:UI的舞台
1. WindowStage (窗口阶段):
-
- 代表一个UIAbility实例所关联的窗口集合。
- 它是
UIAbility和具体UI窗口(Window)之间的桥梁。 onWindowStageCreate和onWindowStageDestroy是其生命周期的体现。- 核心方法:
loadContent()- 加载ArkTS页面。
2. Window (窗口):
-
- 代表屏幕上一个具体的UI窗口。一个
WindowStage可以管理多个Window(实现多窗口)。 - 负责窗口的创建、销毁、大小、位置、背景色、状态栏/导航栏控制等。
- 在
loadContent之后,可以通过windowStage.getMainWindow()获取主窗口进行更精细的控制。
- 代表屏幕上一个具体的UI窗口。一个
- 关系:
UIAbility-> 拥有 ->WindowStage-> 管理 -> 一个或多个Window-> 呈现 -> UI内容。
(四) Resource (资源) 与 module.json5 (配置)
resources目录:集中存放字符串(strings.json)、颜色(colors.json)、布局文件、图片等资源。通过$r('app.string.hello')等方式在代码中引用。module.json5:应用的核心配置文件。定义了:
-
- 应用/Ability的基本信息(
name,description)。 - 声明
UIAbility及其类型(page)。 - 声明所需权限 (
reqPermissions)。 - 声明后台运行模式 (
backgroundModes)。 - 应用图标、标签等。
- 应用/Ability的基本信息(