一、前言:从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.json5pages目录位置调整
建议:新建一个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模型有助于理解鸿蒙发展脉络,但无需深入研究 |