鸿蒙Stage模型与FA模型详解
一、前言:从FA到Stage的演进
在HarmonyOS的发展历程中,应用开发模型经历了从FA模型到Stage模型的重要演进。FA(Feature Ability)模型是HarmonyOS早期版本(API 7及更早)支持的应用开发模型,而Stage模型则是从API 9开始引入、HarmonyOS NEXT版本主推且会长期演进的新一代应用开发模型。
一句话概括:FA模型是鸿蒙早期的开发范式,Stage模型是官方主推的现代工程化架构。如果你现在开始学习鸿蒙开发,直接选择Stage模型即可,FA模型仅作为理解历史演进的需要。
二、FA模型详解
2.1 什么是FA模型
FA模型是“Feature Ability”(功能能力)的缩写,是HarmonyOS早期版本开始支持的应用开发模型。该模型基于微内核架构,通过IPC(进程间通信)和分布式软总线完成轻量化、松耦合的模块间通信和服务调用。
FA模型将Ability分为两大类:
-
Page Ability(页面能力):负责展示应用界面,类似于Android的Activity,包含独立的界面和业务逻辑
-
Service Ability(服务能力):没有界面,主要用于在后台执行任务
2.2 FA模型的配置文件
在FA模型中,应用配置通过config.json文件完成,该文件包含三个必填标签:
| 标签 | 说明 |
|---|---|
| app | 应用级别的配置,如bundleName、vendor、version等 |
| deviceConfig | 设备相关的配置 |
| module | HAP模块的配置,包含abilities、deviceType等信息 |
config.json配置示例:
json
{
"app": {
"vendor": "example",
"bundleName": "com.example.demo",
"version": {
"code": 1000000,
"name": "1.0.0"
}
},
"module": {
"mainAbility": ".MainAbility_entry",
"deviceType": ["tablet"],
"abilities": [
{
"name": ".MainAbility_entry",
"type": "page",
"launchType": "multiton",
"orientation": "unspecified"
}
]
}
}
2.3 FA模型的包结构
FA模型的应用程序包结构中,所有资源文件、库文件和代码文件都存放在assets文件夹中,内部进一步区分为entry和js文件夹:
text
- config.json # 应用配置文件 - assets/ ├── entry/ # resources目录和resources.index │ ├── resources/ # 资源文件(字符串、图片等) │ └── resources.index └── js/ # 编译后的代码文件 - pack.info # 描述HAP属性的文件
2.4 FA模型的上下文获取方式
在FA模型中,开发者通过featureAbility获取上下文:
typescript
import featureAbility from '@ohos.ability.featureAbility';
// 获取上下文
let context = featureAbility.getContext();
// 拉起Ability
featureAbility.startAbility({
bundleName: 'com.example.app',
abilityName: 'com.example.MainAbility'
}).then(() => {
console.log('Ability启动成功');
});
三、Stage模型详解
3.1 什么是Stage模型
Stage模型是HarmonyOS从API 9开始引入的新一代应用开发模型,名称中的“Stage”(舞台)寓意是为开发者提供一个新的展现舞台。Stage模型的设计目标主要是方便开发者开发分布式环境下的复杂应用,从架构设计层面规范业务逻辑与UI交互的开发方式。
3.2 Stage模型的核心概念
Stage模型包含以下核心概念:
1. AbilityStage(应用舞台)
-
每个Entry或Feature类型的HAP在运行期都有一个AbilityStage类实例
-
当HAP中的代码首次被加载到进程时,系统会先创建AbilityStage实例
-
负责管理该模块下Ability的整体运行状态,可在此进行模块级初始化
2. UIAbility(界面能力组件)
-
包含UI的应用组件,主要用于和用户交互
-
生命周期包含:创建(Create)、销毁(Destroy)、前台(Foreground)、后台(Background)状态
-
每个UIAbility实例与一个WindowStage类实例绑定
3. ExtensionAbility(扩展能力组件)
-
面向特定场景的应用组件,开发者不能直接从ExtensionAbility派生,而是使用其派生类
-
常见派生类包括:
-
FormExtensionAbility:卡片场景 -
InputMethodExtensionAbility:输入法场景 -
WorkSchedulerExtensionAbility:闲时任务场景
-
4. WindowStage(窗口舞台)
-
应用进程内的窗口管理器
-
包含一个主窗口,为ArkUI提供绘制区域
5. Context(上下文)
-
在运行期提供各种资源和能力的调用接口
-
UIAbility和ExtensionAbility各有不同的Context类,均继承自基类Context
3.3 Stage模型的配置文件
Stage模型使用module.json5作为应用配置文件,结构更清晰、模块化程度更高。配置文件包含以下主要部分:
json5
{
"module": {
"name": "entry",
"type": "entry",
"srcEntry": "./ets/ability/AbilityStage.ets",
"abilities": [
{
"name": "MainAbility",
"srcEntry": "./ets/ability/MainAbility.ets",
"launchType": "standard",
"visible": true
}
],
"extensionAbilities": [
{
"name": "FormAbility",
"srcEntry": "./ets/ability/FormAbility.ets",
"type": "form"
}
]
}
}
3.4 Stage模型的包结构
Stage模型对包结构进行了优化,在顶层增加了AppScope目录存放公共资源,并增加了AbilityStage.ts作为HAP加载入口。
text
- AppScope/ # 应用公共资源
└── resources/
└── base/
- entry/ # 主模块
├── src/
│ └── main/
│ ├── ets/
│ │ ├── ability/
│ │ │ ├── AbilityStage.ets # HAP加载入口
│ │ │ └── MainAbility.ets # UIAbility
│ │ └── pages/
│ └── resources/
└── module.json5 # 模块配置文件
3.5 Stage模型的上下文获取方式
在Stage模型中,上下文通过组件实例的context属性直接获取,无需依赖featureAbility:
typescript
// 组件内直接使用this.context
@Entry
@Component
struct MyComponent {
async writeToFile() {
// 使用组件的context属性获取文件目录
const filesDir = await this.context.getFilesDir();
// 文件操作...
}
}
在UIAbility中获取上下文:
typescript
export default class MainAbility extends UIAbility {
onCreate(want, launchParam) {
// 直接使用this.context
let context = this.context;
}
}
四、FA模型与Stage模型核心对比
4.1 对比总览
| 对比维度 | FA模型(旧版) | Stage模型(推荐) |
|---|---|---|
| 推出时间 | 早期版本(API 7及以前) | API 9起,持续演进 |
| 主推程度 | 已停止演进,不再主推 | 长期演进,官方主推 |
| 架构设计 | 单进程架构 | 多进程架构,支持多窗口 |
| 组件类型 | FeatureAbility、ServiceAbility | UIAbility、ExtensionAbility |
| 引擎实例 | 每个组件独享一个ArkTS引擎实例 | 多个组件共享同一个ArkTS引擎实例 |
| 内存占用 | 较高(每个组件独立引擎) | 优化(共享引擎,减少内存占用) |
| 上下文获取 | featureAbility.getContext() |
组件内this.context |
| 配置文件 | config.json | module.json5 |
| 适合场景 | 简单应用、快速开发 | 复杂应用、多设备协同、分布式场景 |
| 学习曲线 | 较平缓(类似Android开发) | 较陡峭(需要理解新架构) |
4.2 设计思想对比
FA模型的设计思想:
-
基于微内核架构,通过IPC和分布式软总线实现模块间通信
-
强调轻量化、松耦合
-
适合需要快速响应和高效交互的场景
Stage模型的设计思想:
-
多个组件共享同一个ArkTS引擎实例,实现对象和状态的方便共享
-
数据与UI分离:Ability中产生数据,数据驱动UI变化(UI = f(state))
-
更好地支持跨端迁移和多端协同
-
对后台进程进行有序治理,保障用户体验和系统安全
4.3 生命周期对比
FA模型的生命周期(以Page Ability为例):
-
onStart():创建时调用 -
onActive():获得焦点时调用 -
onInactive():失去焦点时调用 -
onBackground():进入后台时调用 -
onStop():销毁时调用
Stage模型的生命周期:
-
AbilityStage级别:模块级生命周期
-
onCreate():模块加载时调用,适合模块级初始化
-
-
UIAbility级别:
-
onCreate():Ability创建时调用,适合轻量初始化 -
onWindowStageCreate():窗口舞台创建,UI相关初始化建议在此进行,如loadContent() -
onForeground():切换到前台 -
onBackground():切换到后台 -
onDestroy():销毁释放资源
-
经验建议:不要在
onCreate()中执行重任务,否则会导致启动卡顿。UI相关的初始化应放在onWindowStageCreate()中。
4.4 API调用方式对比
FA模型(使用featureAbility):
typescript
import featureAbility from '@ohos.ability.featureAbility';
// 启动Ability
featureAbility.startAbility({
bundleName: 'com.example.app',
abilityName: 'com.example.MainAbility',
parameters: { key: 'value' }
}).then(() => {
// 启动成功
});
// 获取参数
featureAbility.getWant((error, want) => {
let params = want.parameters;
});
Stage模型(使用context):
typescript
// 启动Ability - 通过context
getContext(this).startAbility({
bundleName: 'com.example.app',
abilityName: 'com.example.MainAbility',
parameters: { key: 'value' }
}).then(() => {
// 启动成功
});
// 获取参数 - 在UIAbility中接收
export default class MainAbility extends UIAbility {
onCreate(want, launchParam) {
let params = want.parameters;
// 可通过globalThis或AppStorage传递给UI组件
}
}
五、从FA迁移到Stage模型的实践要点
5.1 迁移概述
由于FA模型已停止演进,建议开发者将现有FA模型应用迁移到Stage模型。迁移主要涉及以下方面:
5.2 代码目录调整
-
在顶层增加
AppScope目录存放公共资源 -
增加
AbilityStage.ts作为HAP加载入口 -
配置文件从
config.json变更为module.json5 -
pages目录位置调整
建议:新建一个Stage模型的工程,将原有代码逐步复制过来,然后逐个解决API差异问题。
5.3 API变更适配
-
启动Ability:从
featureAbility.startAbility()改为context.startAbility() -
关闭Ability:从
featureAbility.terminateSelf()改为context.terminateSelf() -
获取参数:从
featureAbility.getWant()改为在UIAbility的onCreate()或onNewWant()中接收
5.4 数据传递方式变化
在FA模型中,参数可直接在组件内通过featureAbility.getWant()获取。在Stage模型中:
-
方式一:在UIAbility中接收want,通过
globalThis传递给UI组件 -
方式二:使用
AppStorage进行数据关联,UI组件用@StorageLink接收
六、总结与选择建议
6.1 核心结论
-
FA模型是历史产物:作为API 7及以前版本的应用模型,FA模型已停止演进,不再主推
-
Stage模型是未来方向:作为HarmonyOS NEXT主推且会长期演进的模型,Stage模型代表了鸿蒙应用开发的未来趋势
-
Stage模型的核心优势:
-
组件共享ArkTS引擎,减少内存占用
-
UI与业务逻辑分离,架构更清晰
-
对后台进程有序治理,系统更安全
-
更好地支持多设备、分布式场景
-
6.2 选择建议
| 你的情况 | 建议 |
|---|---|
| 刚入门鸿蒙开发 | 直接学习Stage模型,无需了解FA模型 |
| 新项目立项 | 使用Stage模型开发 |
| 维护FA模型老项目 | 建议规划迁移到Stage模型 |
| 学习历史演进 | 了解FA模型有助于理解鸿蒙发展脉络,但无需深入研究 |
更多推荐

所有评论(0)