【高心星出品】
文章目录
- 全局广播的使用
- 公共事件
- 接受系统公共事件原理
- 发布与订阅自定义公共事件
- 订阅系统事件
全局广播的使用
全局广播可以用来做应用间通信,进程间通信,包含订阅、发布等功能。
公共事件
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)}
}
ght.Bolder).border({ width: 3, color: Color.Red })}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}