1 公共事件的开发

1.1 公共事件订阅开发

当需要订阅某个公共事件,获取某个公共事件传递的参数时,可以创建一个订阅者对象,用于作为订阅公共事件的载体,订阅公共事件并获取公共事件传递而来的参数。订阅部分系统公共事件需要先申请权限。

公共事件订阅开发接口如下:

(1)创建订阅者对象(callback):

createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback:AsyncCallback)。

(2)创建订阅者对象(promise):

createSubscriber(subscribeInfo: CommonEventSubscribeInfo)。

(3)订阅公共事件:

subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback)。

1.2 公共事件发布开发

当需要发布某个自定义公共事件时,可以通过此方法发布事件。发布的公共事件可以携带数据,供订阅者解析并进行下一步处理。

公共事件发布开发接口如下:

(1)发布公共事件:

publish(event: string, callback: AsyncCallback)。

(2)指定发布信,息并发布公共事件:

publish(event: string,options:CommonEventPublishData,callback: AsyncCallback)。

1.3 公共事件取消订阅开发

订阅者需要取消已订阅的某个公共事件时,可以通过此方法取消订阅事件。公共事件取消订阅开发接口如下:

取消阅公共事件:

unsubscribe(subscriber:CommonEventSubscriber,callback?:ASyncCallback)。

2 实战:公共事件App(订阅、发布、取消)

本文主要演示如何实现公共事件APP的订阅、发布和取消操作。

打开DevEco Studio,选择一个Empry Abliy工程模板,创建工程代码。

2.1 添加按钮

在Index.ets的Text组件下,添加4个按钮,代码如下:

// 导入公共事件管理器
import commonEventManager from '@ohos.commonEventManager';

@Entry
@Component
struct Index {
  @State message: string = '公共事件APP'
  // 用于接收事件数据
  @State eventData: string = ''
  // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
  private subscriber: commonEventManager.CommonEventSubscriber | null = null;

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(25)
          .fontWeight(FontWeight.Bold)

        // 创建订阅者
        Button(('创建订阅者'), { type: ButtonType.Capsule })
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.createSubscriber()
          })

        // 订阅事件
        Button(('订阅事件'), { type: ButtonType.Capsule })
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.subscriberCommonEvent()
          })

        // 发送事件
        Button(('发送事件'), { type: ButtonType.Capsule })
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.publishCommonEvent()
          })

        // 发送事件
        Button(('取消订阅'), { type: ButtonType.Capsule })
          .fontSize(40)
          .fontWeight(FontWeight.Medium)
          .margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.unsubscribeCommonEvent()
          })

       
      }
      .width('100%')
    }
    .height('100%')
  }
}

其中4个按钮分别设置了onClick单击事件,分别用来触发创建订阅者、订阅事件、

发送事件以及取消订阅的操作。

界面效果如图所示:

2.2 添加Text组件显示接收的事件

为了能显示接收到的事件的信息,在4个按钮下面添加一个Text组件,代码如下:

        // 用于接收事件数据
        @State eventData: string = ''

// 接收到的事件数据
        Text(this.eventData)
          .fontSize(25)
          .fontWeight(FontWeight.Bold)

Text组件的显示内容,通过@State绑定了eventData变量。当evenData变量变化时,Text的显示内容也会实时更新。

2.3 设置按钮单击事件方法

4个按钮的单击事件方法如下:

// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
  private subscriber: commonEventManager.CommonEventSubscriber | null = null;

private createSubscriber() {
    if (this.subscriber) {
      this.message = "订阅者已创建";
    } else {
      commonEventManager.createSubscriber({ // 创建订阅者
        events: ["testEvent"] // 指定订阅的事件名称
      }, (err, subscriber) => { // 创建结果的回调
        if (err) {
          this.message = "创建订阅者失败"
        } else {
          this.subscriber = subscriber; // 创建订阅成功
          this.message = "创建订阅者成功";
        }
      })
    }
  }

  private subscriberCommonEvent() {
    if (this.subscriber) {
      // 根据创建的subscriber开始订阅事件
      commonEventManager.subscribe(this.subscriber, (err, data) => {
        if (err) {
          // 异常处理
          this.eventData = "订阅事件失败: " + err;
        } else {
          // 接收到事件
          this.eventData = "订阅事件成功: " + JSON.stringify(data);
        }
      })
    } else {
      this.message = "请先创建订阅者";
    }
  }

  private publishCommonEvent() {
    // 发布公共事件
    commonEventManager.publish("testEvent", (err) => { // 结果回调
      if (err) {
        this.message = "发送公共事件失败: " + err;
      } else {
        this.message = "发布带有数据的公共事件成功";
      }
    })
  }

  private unsubscribeCommonEvent() {
    if (this.subscriber) {
      commonEventManager.unsubscribe(this.subscriber, (err) => { // 取消订阅事件
        if (err) {
          this.message = "取消订阅事件失败: " + err;
        } else {
          this.subscriber = null;
          this.message = "取消订阅事件成功";
        }
      })
    } else {
      this.message = "已经订阅";
    }
  }

subscriber是作为订阅者的变量。createSubscriber()方法用于创建订阅者。subscriberCommonEvent方法用于订阅事件。publishCommonEvent()方法用于发布公共事件。unsubscribeCommonEvent()方法用于取消订阅。

2.4 运行

“创建订阅者”界面效果如图所示:

单击“订阅事件”以及“发送事件”按钮后,界面效果如图所示:

单击“取消订阅”按钮后,界面效果如图所示:

由图中可以看到,订阅者已经能够正确接收事件,并将事件的信息显示在页面上了。这样可以实现应用与系统之间,应用与应用之间的数据传递。

3 小结

本文围绕鸿蒙公共事件开发展开,系统讲解了订阅、发布、取消订阅三大核心能力及实战案例,突出鸿蒙公共事件“跨应用/系统数据传递”的简单易用特性,助力开发者快速掌握分布式通信关键技能。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐