鸿蒙:使用AppStorageV2实现跨Ability共享
1、前言
如果你的应用有多个ability,那么该如何在多个ability之间跳转和传输数据呢?很简单,使用AppStorageV2状态管理即可实现。
本篇博客带领大家写个练手的项目,学习体验使用AppStorageV2实现跨Ability共享。
2、参考文档
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-v1-v2-migration-application-and-others#appstorage-appstoragev2https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-v1-v2-migration-application-and-others#appstorage-appstoragev2
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里的bundleNameabilityName: '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里的bundleNameabilityName: '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里的bundleNameabilityName: 'EntryAbility'};this.context.startAbility(wantInfo);})}.width('100%').layoutWeight(1).justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}.justifyContent(FlexAlign.SpaceBetween).height('100%')}
}