本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、概述
UIAbility组件启动模式是指UIAbility实例在启动时的不同呈现状态,系统针对不同的业务场景提供了三种启动模式,管理应用实例和资源。
1.1 三种启动模式
- singleton(单实例模式):默认启动模式,保证系统中只存在一个该类型的UIAbility实例
- multiton(多实例模式):每次启动都会创建新的UIAbility实例
- specified(指定实例模式):通过特定标识符控制实例的创建和复用
1.2 版本支持
- 从API version开始支持这三种启动模式
- 支持在元服务中使用
- standard是multiton的曾用名,效果与多实例模式一致
二、singleton(单实例模式)
2.1 核心特性
单实例模式是默认的启动模式,其主要特点包括:
- 系统中只存在唯一一个该UIAbility实例
- 在最近任务列表中只存在一个该类型的UIAbility实例
- 适合全局单例的业务场景
2.2 运行机制
当应用进程中该类型的UIAbility实例已经存在时:
- 复用系统中已存在的UIAbility实例
- 不会重新创建新的UIAbility实例
- 只会进入该UIAbility的onNewWant()回调
- 不会进入onCreate()和onWindowStageCreate()生命周期回调
2.3 特殊情况处理
- 如果已经创建的实例仍在启动过程中,调用startAbility()方法启动该实例将收到错误码16000082
- 这种机制确保了实例创建的原子性和一致性
2.4 配置方法
// module.json5配置文件
{
"module": {
"abilities": [
{
"name": "MainAbility",
"launchType": "singleton",
// 其他配置项...
}
]
}
}
2.5 适用场景
- 应用的主界面
- 全局性的服务页面
- 需要保持单一实例的业务模块
三、multiton(多实例模式)
3.1 核心特性
多实例模式的特点包括:
- 每次调用startAbility()方法都会创建新的UIAbility实例
- 在最近任务列表中可以看到多个该类型的UIAbility实例
- 适合需要独立实例的业务场景
3.2 运行机制
- 每次启动都会创建全新的UIAbility实例
- 会完整执行onCreate()和onWindowStageCreate()生命周期回调
- 各实例之间相互独立,互不影响
3.3 配置方法
// module.json5配置文件
{
"module": {
"abilities": [
{
"name": "DocumentEditor",
"launchType": "multiton",
// 其他配置项...
}
]
}
}
3.4 适用场景
- 文档编辑页面(每个文档一个独立实例)
- 多标签浏览界面
- 需要并行处理的业务模块
四、specified(指定实例模式)
4.1 核心特性
指定实例模式是一种高级启动模式,其特点包括:
- 通过唯一的Key值标识和控制UIAbility实例
- 结合了单实例和多实例模式的优点
- 需要显式管理实例标识
4.2 运行原理
4.2.1 启动流程
- 设置标识符:调用startAbility()方法时,在Want的parameters字段中设置唯一的Key值
- 系统拦截:系统在拉起UIAbility之前,先进入对应的AbilityStage的onAcceptWant()生命周期回调
- 标识符获取:在onAcceptWant()回调中获取用于标识目标UIAbility的Key值
- 实例匹配:系统根据获取的Key值来匹配UIAbility实例
4.2.2 匹配结果处理
- 匹配成功:启动已存在的UIAbility实例,并进入onNewWant()生命周期回调
- 匹配失败:创建新的UIAbility实例,并进入onCreate()和onWindowStageCreate()生命周期回调
4.3 配置方法
// module.json5配置文件
{
"module": {
"abilities": [
{
"name": "SpecifiedAbility",
"launchType": "specified",
// 其他配置项...
}
]
}
}
4.4 代码示例
4.4.1 启动指定实例
// 在EntryAbility中启动SpecifiedAbility
const wantInfo = {
deviceId: '', // 设备ID,空表示本设备
bundleName: 'com.example.myapp',
abilityName: 'SpecifiedAbility',
parameters: {
// 设置唯一的实例标识符
instanceKey: 'document_12345'
}
};
try {
await this.context.startAbility(wantInfo);
} catch (error) {
console.error(`启动SpecifiedAbility失败,错误码: ${error.code}`);
}
4.4.2 处理实例标识
// 在AbilityStage中处理实例标识
import AbilityStage from '@ohos.app.ability.AbilityStage';
export default class MyAbilityStage extends AbilityStage {
onAcceptWant(wantInfo): string {
// 从wantInfo中获取实例标识符
const instanceKey = wantInfo.parameters?.instanceKey;
if (instanceKey) {
// 返回实例标识符,系统会根据此标识符匹配现有实例
return instanceKey;
}
// 如果没有提供标识符,生成默认标识符
return `default_${Date.now()}`;
}
}
4.5 适用场景
- 文档应用:新建文档时创建新实例,打开已存在文档时复用现有实例
- 会话页面:每个聊天会话对应一个特定的实例
- 多任务处理:需要精确控制实例复用的复杂业务场景
五、启动模式对比
5.1 特性对比表
| 特性 | singleton | multiton | specified |
|---|---|---|---|
| 实例数量 | 单实例 | 多实例 | 按标识符控制 |
| 内存占用 | 低 | 高 | 中等 |
| 启动速度 | 快(复用) | 慢(新建) | 中等 |
| 适用场景 | 全局单例 | 独立实例 | 精确控制 |
| 配置复杂度 | 简单 | 简单 | 复杂 |
| 灵活性 | 低 | 中 | 高 |
5.2 生命周期回调差异
| 启动模式 | 实例存在时 | 实例不存在时 |
|---|---|---|
| singleton | onNewWant() | onCreate() + onWindowStageCreate() |
| multiton | onCreate() + onWindowStageCreate() | onCreate() + onWindowStageCreate() |
| specified | onNewWant() | onCreate() + onWindowStageCreate() |
六、总结
6.1 模式选择
- 默认选择singleton:对于大多数应用界面,优先使用单实例模式。
- 特定场景用multiton:需要并行处理的业务使用多实例模式。
- 复杂需求用specified:需要精确控制实例复用的情况使用指定实例模式。
6.2 性能优化
- 合理使用singleton模式减少内存占用。
- 对于不常用的功能页面使用multiton模式。
- 使用specified模式时要确保标识符的唯一性和稳定性。
6.3 注意事项
- 标识符管理:在specified模式中,要确保标识符的唯一性和一致性。
- 状态恢复:在onNewWant()回调中正确处理状态恢复逻辑。
- 错误处理:妥善处理startAbility()可能抛出的异常。
1986

被折叠的 条评论
为什么被折叠?



