头图

【高心星出品】

全局广播的使用

全局广播可以用来做应用间通信,进程间通信,包含订阅、发布等功能。

公共事件

CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。

公共事件从系统角度可分为:系统公共事件和自定义公共事件。

  • 系统公共事件:CES内部定义的公共事件,当前仅支持系统应用和系统服务发布,例如HAP安装、更新、卸载等公共事件。目前支持的系统公共事件请参见系统公共事件列表。
  • 自定义公共事件:应用定义的公共事件,可用于实现跨进程的事件通信能力。
接受系统公共事件原理

每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。

发布与订阅自定义公共事件

案例功能:在Index页面订阅自定义公共事件,Index页面跳转到other页面,other页面发布全局广播,Index页面订阅者接受广播事件并弹窗显示数据。

Index页面代码

import { commonEventManager } from '@kit.BasicServicesKit';
import { promptAction, router } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  @State message: string = '';
  // 创建订阅对象
  aboutToAppear(): void {
    let  info = commonEventManager.createSubscriberSync({ events: ['event_01']})
    // 订阅广播
    commonEventManager.subscribe(info,(err,data)=>{
      if(err)
      {
        console.error('gxxt 订阅信息错误: ',err.message)
        return
      }
      // 接收发来的信息并弹窗显示
      AlertDialog.show({message:'这是Index页面广播接受的信息: '+data.data,confirm:{value:'确定',action:()=>{}}})
    })
  }
  build() {
    Column() {
      Text('Index页面')
        .fontSize(30)
        .fontWeight(FontWeight.Bolder)
        .margin(20)
      Button('跳转')
        .width('60%')
        .onClick(() => {
          router.pushUrl({url:'pages/other'})
        })
        .margin(20)


    }
    .height('100%')
    .width('100%')
  }
  aboutToDisappear(): void {
   //  解除订阅广播
   // commonEventManager.unsubscribe(this.info)
  }
}

other页面代码

import { commonEventManager } from '@kit.BasicServicesKit';

@Entry
@Component
struct Other {
  @State message: string = 'Hello World';

  build() {
    Column(){
      Button('发布广播')
        .width('60%')
        .onClick(()=>{
          // 发送广播,携带数据
          commonEventManager.publish('event_01',{data:'我来自other页面的数据'},(err)=>{
           if(err){
             console.error('gxxt 广播发送错误: '+err.message)
           }
           console.log('gxxt 广播放松成功!')
          })
        })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

订阅系统事件

案例功能:在页面订阅飞行模式转变的系统事件,如果接受到该事件,就将该事件的数据显示在文本框中。

Eventpage页面代码

import { commonEventManager } from '@kit.BasicServicesKit';

@Entry
@Component
struct Eventpage {
  @State message: string = '手机状态: ';

  aboutToAppear(): void {
    // 飞行模式转变的事件
    let info = commonEventManager.createSubscriberSync({
      events: [commonEventManager.Support.COMMON_EVENT_AIRPLANE_MODE_CHANGED]
    })
    commonEventManager.subscribe(info, (err, data) => {
      if (err) {
        console.error('gxxt 订阅飞行模式转变广播失败!')
        return
      }
      this.message = '手机状态: ' + data.data
    })
  }

  build() {
    Column() {
      Text(this.message).fontSize(30).fontWeight(FontWeight.Bolder).border({ width: 3, color: Color.Red })
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

高心星
1 声望1 粉丝

华为开发者专家(HDE)。 10年教学经验,兼任多家科技公司技术顾问。先后从事JavaEE项目开发、Python爬虫、HarmonyOS移动应用开发等课程的教学工作。参与开发《鸿蒙应用开发基础》和《鸿蒙项目实战》等课程。