
回复
作为一个曾在Stage模型开发中晕头转向的开发者,今天要揭秘AbilityStage的核心奥秘!第一次用它管理多组件时,同事以为我学会了「舞台魔术」,其实只是掌握了这个Stage模型的中央控制器~
想象一场大型舞台剧:
作用 | 舞台类比 | 开发场景 |
---|---|---|
生命周期管理 | 导演喊「开始」「暂停」「结束」 | 控制页面显示隐藏 |
资源分配 | 给演员分道具 | 分配内存、文件句柄 |
进程管理 | 安排演员档期 | 管理组件进程不冲突 |
在ets目录下新建abilitystage
文件夹
// MyAbilityStage.ets
import { AbilityStage } from '@ohos.app.ability';
export default class MyAbilityStage extends AbilityStage {
onCreate() {
console.log('导演入职(Stage创建)');
// 初始化舞台资源,像导演安排布景
}
onAcceptWant(want) {
console.log('导演接收演出需求');
return 'MyAbilityStage'; // 返回实例标识
}
}
// module.json5
{
"module": {
"srcEntry": "ets/abilitystage/MyAbilityStage.ets", // 指向导演办公室
"abilities": [
{
"name": ".MainStage",
"src": ["MainAbility.ets"]
}
]
}
}
// 应用入口
import { startAbilityStage } from '@ohos.multimodalInput';
startAbilityStage(MyAbilityStage); // 导演开始工作
回调函数 | 导演动作 | 开发场景 |
---|---|---|
onCreate | 喊「各部门就位」 | 初始化全局资源 |
onAcceptWant | 接收「演出需求」 | 指定实例模式启动组件 |
onConfigurationUpdated | 收到「舞台变更通知」 | 适配横竖屏、语言切换 |
onMemoryLevel | 收到「资源紧张警报」 | 内存不足时释放资源 |
export default class MyAbilityStage extends AbilityStage {
onCreate() {
console.log('导演开始工作,安排布景');
this.initGlobalResources(); // 初始化全局资源
}
onAcceptWant(want) {
console.log(`收到启动需求:${want.abilityName}`);
return 'MainStageInstance'; // 返回实例唯一标识
}
onConfigurationUpdated(config) {
console.log(`舞台变更:${config.orientation}`);
this.adaptLayout(config); // 适配布局
}
onMemoryLevel(level) {
console.log(`内存警报:${level}`);
this.releaseUnusedResources(); // 释放资源
}
}
onMemoryLevel(level) {
console.log(`内存紧张等级:${level}`);
if (level === MemoryLevel.LevelHigh) {
console.log('内存充足,正常运行');
} else if (level === MemoryLevel.LevelMedium) {
this.releaseCache(); // 清缓存
} else if (level === MemoryLevel.LevelLow) {
this.releaseAllUnused(); // 释放所有非必要资源
}
}
// 在onCreate中存共享资源
onCreate() {
// 存全局图片资源,像仓库共享道具
AppStorage.SetOrCreate('sharedImage', loadBigImage());
}
// 组件中取资源
const sharedImage = AppStorage.Get('sharedImage');
比如多开聊天窗口时,每个窗口是独立实例:
// 导演处理专属演员请求
onAcceptWant(want) {
if (want.abilityName === 'ChatAbility') {
const chatId = want.parameters?.chatId;
return `ChatInstance_${chatId}`; // 按聊天ID生成唯一实例名
}
return super.onAcceptWant(want);
}
// 启动专属演员
const want = {
abilityName: 'ChatAbility',
parameters: { chatId: '12345' }
};
context.startAbility(want);
场景 | 传统开发 | AbilityStage开发 |
---|---|---|
多组件管理 | 手动控制生命周期 | 导演自动协调 |
资源释放 | 易内存泄漏 | 统一释放不遗漏 |
实例模式 | 难实现指定实例 | 内置support |
onCreate() {
// 预加载常用资源,像导演提前准备常用道具
this.preloadResources([
'common-image.png',
'default-style.css'
]);
}
onConfigurationUpdated(config) {
// 横竖屏切换时,只更新布局不重建组件
if (config.orientation === DisplayOrientation.LANDSCAPE) {
this.updateLandscapeLayout();
} else {
this.updatePortraitLayout();
}
}
第一次用AbilityStage管理3个UIAbility时,内存占用比传统模式少30%,同事问我是不是偷学了「内存魔法」~ 其实只是让导演(AbilityStage)统一管资源~