
回复
哈喽!我是小L,那个在鸿蒙Stage模型里「玩组件管理」的女程序员~ 你知道吗?在鸿蒙应用的「舞台」上,每个Stage都是一场独立演出,而AbilityStage就是这场演出的「总指挥」——掌管着组件生命周期、资源分配和进程调度的「核心大脑」!今天就来聊聊这个Stage模型的「心脏组件」,看它如何让应用运行如丝般顺滑~
本质定位:
abilityStage
文件夹,新增AppStage.ets
文件:
// 生命周期回调
onCreate() {
console.log('[AppStage] onCreate');
}
"module": {
"srcEntry": "ets/abilityStage/AppStage", // 指向AbilityStage文件
"abilities": [
// 其他组件声明...
]
}
角色 | AbilityStage | UIAbility |
---|---|---|
作用范围 | 全局(整个Stage模块) | 局部(单个界面组件) |
创建时机 | Stage启动时唯一创建 | 按需创建(可多个实例) |
核心能力 | 资源管理、进程调度 | 界面展示、用户交互 |
类比:
回调名称 | 触发时机 | 典型用途 |
---|---|---|
onCreate | Stage创建时(HAP首次加载) | 全局资源初始化(如数据库连接) |
onAcceptWant | 接收指定模式(specified)启动请求 | 处理跨Stage的显式调用 |
onConfigurationUpdated | 系统配置变更(如语言、屏幕旋转) | 动态更新资源(如多语言文本) |
onMemoryLevel | 系统内存告警(低内存/内存不足) | 释放非必要资源(如缓存图片) |
import { AbilityStage, AbilityConstant } from '@ohos.app.ability';
export default class AppStage extends AbilityStage {
// 内存状态监听
onMemoryLevel(level: AbilityConstant.MemoryLevel) {
switch (level) {
case AbilityConstant.MemoryLevel.LEVEL_HIGH: // 内存充足
this.restoreCaches(); // 恢复缓存
break;
case AbilityConstant.MemoryLevel.LEVEL_LOW: // 内存不足
this.clearUnusedResources(); // 清理无用资源
break;
}
}
// 清理非必要资源
private clearUnusedResources() {
// 释放图片缓存
ImageCache.getInstance().clear();
// 关闭闲置网络连接
NetworkManager.getInstance().closeIdleConnections();
}
}
场景:多个UIAbility需要共享用户登录状态
// 在AbilityStage中创建共享状态
export default class AppStage extends AbilityStage {
private static _userInfo: UserInfo; // 全局用户信息
onCreate() {
// 初始化时加载用户信息(如从本地存储)
AppStage._userInfo = LocalStorage.get('userInfo');
}
// 提供获取用户信息的公共接口
static getUserInfo(): UserInfo {
return AppStage._userInfo;
}
}
// 在UIAbility中使用共享资源
@Entry
@Component
struct MainAbility {
build() {
Text(`欢迎 ${AppStage.getUserInfo().name}`)
.fontSize(20);
}
}
默认策略:
{
"abilities": [
{
"name": "BackgroundService",
"type": "service",
"process": "com.example.background" // 独立进程名
}
]
}
优势:
步骤1:在Stage B的AbilityStage中声明接收方法
// Stage B的AbilityStage
export default class BStage extends AbilityStage {
onAcceptWant(want: Want): string {
if (want.action === 'callBComponent') {
// 执行跨Stage逻辑(如启动指定UIAbility)
this.startAbility({ abilityName: 'BAbility' });
return 'Stage B handled';
}
return '';
}
}
步骤2:在Stage A中发送跨Stage请求
// Stage A的UIAbility
import { wantAgent } from '@ohos.app.ability';
const callBStage = () => {
const want = {
deviceId: '',
bundleName: 'com.example.stageB', // Stage B的包名
action: 'callBComponent' // 自定义动作
};
wantAgent.sendWant(want, (err, data) => {
if (!err) {
console.log('Stage B响应:', data);
}
});
};
// ❌ 错误:在Stage中直接修改UI组件状态
export default class AppStage extends AbilityStage {
onCreate() {
new MainAbility().updateUI(); // 无法访问具体UI实例
}
}
// ✅ 正确:通过事件机制通知UIAbility更新
class EventManager {
static onStageEvent(callback: () => void) { /* 实现事件订阅 */ }
}
export default class AppStage extends AbilityStage {
onCreate() {
EventManager.emit('stageReady'); // 触发事件
}
}
风险:全局单例可能导致内存泄漏或初始化顺序问题
替代方案:
// 跨设备调用Stage时需声明权限
{
"reqPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_SCHEDULE"
}
]
}
根据实时内存/CPU占用,自动调整组件进程优先级:
未来可能推出轻量化Stage,无需创建AbilityStage即可运行简单组件,降低微型应用(如原子化服务)的开发成本。
在HarmonyOS Studio中提供Stage资源监控面板,实时显示内存占用、进程状态、跨Stage调用链路,辅助开发者快速定位性能瓶颈。
Stage稳定性 =(生命周期管理精准度 × 资源调度效率)÷ 不必要开销
onMemoryLevel
回调中处理