1、前言
如果你的应用有多个ability,那么该如何在多个ability之间跳转和传输数据呢?很简单,使用AppStorageV2状态管理即可实现。
本篇博客带领大家写个练手的项目,学习体验 使用AppStorageV2实现跨Ability共享。
2、参考文档
3、核心思路
通过AppStorageV2实现不同 Ability 间的数据共享。
- 定义MyStorage作为共享数据载体,用@ObservedV2和@Trace标记实现数据监听。
- 两个 Ability 的组件均通过AppStorageV2.connect连接到同一'storage'标识的实例,实现数据同步。
- 跳转通过startAbility+Want指定目标 Ability,数据传递不依赖 Want 参数,而是通过共享的MyStorage实例实时同步。
4、核心代码
@Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
let wantInfo: Want = {
bundleName: 'com.example.harmonydemo', // 替换成AppScope/app.json5里的bundleName
abilityName: 'EntryAbility'
};
this.context.startAbility(wantInfo);
5、运行效果图


6、完整代码
EntryAbility的Index.ets 完整代码:
import { common, Want } from '@kit.AbilityKit';
import { AppStorageV2 } from '@kit.ArkUI';
@ObservedV2
export class MyStorage {
@Trace count: number = 0
}
@Entry
@ComponentV2
struct Index02 {
@Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
build() {
Column() {
Text("不同Ability之间的跳转传参示例")
.fontWeight(FontWeight.Bold)
.fontSize(26)
Column() {
Text(`EntryAbility 数值: ${this.storage.count}`)
.fontSize(30)
.onClick(() => {
this.storage.count++;
})
Button('跳转到ApplicationAbility').onClick(() => {
try {
let wantInfo: Want = {
bundleName: 'com.example.harmonydemo', // 替换成AppScope/app.json5里的bundleName
abilityName: 'ApplicationAbility'
};
this.context.startAbility(wantInfo);
} catch (e) {
console.error('Index02', 'startAbility failed');
}
})
}
.layoutWeight(1)
.width('100%')
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
}
.justifyContent(FlexAlign.SpaceBetween)
.height('100%')
}
}
ApplicationAbility的Index.ets 完整代码:
import { common, Want } from '@kit.AbilityKit';
import { AppStorageV2 } from '@kit.ArkUI';
@ObservedV2
export class MyStorage {
@Trace count: number = 0
}
@Entry
@ComponentV2
struct Index {
@Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
build() {
Column() {
Text("不同Ability之间的跳转传参示例")
.fontSize(26)
.fontWeight(FontWeight.Bold)
Column() {
Text(`ApplicationAbility 数值: ${this.storage.count}`)
.fontSize(30)
.onClick(() => {
this.storage.count++;
})
Button('跳转到ApplicationAbility').onClick(() => {
let wantInfo: Want = {
bundleName: 'com.example.harmonydemo', // 替换成AppScope/app.json5里的bundleName
abilityName: 'EntryAbility'
};
this.context.startAbility(wantInfo);
})
}
.width('100%')
.layoutWeight(1)
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
}
.justifyContent(FlexAlign.SpaceBetween)
.height('100%')
}
}