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 间的数据共享。

  1. 定义MyStorage作为共享数据载体,用@ObservedV2和@Trace标记实现数据监听。
  2. 两个 Ability 的组件均通过AppStorageV2.connect连接到同一'storage'标识的实例,实现数据同步。
  3. 跳转通过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%')
      
        }
      }

      Logo

      为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

      更多推荐