公共事件有哪些简单使用

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

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

  • 系统公共事件:CES内部定义的公共事件,只有系统应用和系统服务才能发布,例如HAP安装,更新,卸载等公共事件。目前支持的系统公共事件详见系统公共事件列表
  • 自定义公共事件:应用自定义一些公共事件用来实现跨进程的事件通信能力。
  • 公共事件按发送方式可分为:无序公共事件、有序公共事件和粘性公共事件。
  • 无序公共事件:CES转发公共事件时,不考虑订阅者是否接收到,按订阅者订阅先后顺序转发。
  • 有序公共事件:CES转发公共事件时,根据订阅者设置的优先级等级,在接收到优先级较高的一个订阅者回复后,再向下一个优先级较低的订阅者转发公共事件。
  • 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅。发送粘性事件必须是系统应用或系统服务,且需要申请ohos.permission.COMMONEVENT_STICKY权限,配置方式请参阅访问控制授权申请指导
HarmonyOS
2024-05-28 21:01:44
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
NingJ

本文主要以发布系统为例进行说明。

1.发布公共事件之前,先创建订阅者信息。

// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 
let subscriber = null; 
// 订阅者信息 
let subscribeInfo = { 
  events: ["usual.event.SCREEN_OFF"], // 订阅灭屏公共事件 
}

2.通过CommonEventManager.createSubscriber创建订阅者,保存返回的订阅者对象subscriber,用于执行后续的订阅、退订等操作。

var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 
 
//订阅者信息 
let subscribeInfo = { 
  events: ["usual.event.SCREEN_OFF"], // 订阅灭屏公共事件 
} 
 
//创建订阅者回调 
function createSubscriberCallBack(err, commonEventSubscriber) { 
  if(!err) { 
    console.info("createSubscriber"); 
    subscriber = commonEventSubscriber; 
  } else { 
    console.error("createSubscriber failed " + JSON.stringify(err)); 
  } 
} 
 
//创建订阅者 
try { 
  CommonEventManager.createSubscriber(subscribeInfo, createSubscriberCallBack); 
} catch (err) { 
  console.error('createSubscriber failed, catch error' + JSON.stringify(err)); 
}

3.创建订阅回调函数,订阅回调函数会在接收到事件时触发。订阅回调函数返回的data内包含了公共事件的名称、发布者携带的数据等信息

var subscriber; //用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 
 
//订阅者信息 
let subscribeInfo = { 
  events: ["usual.event.SCREEN_OFF"], // 订阅灭屏公共事件 
} 
 
//创建订阅者回调 
function createSubscriberCallBack(err, commonEventSubscriber) { 
  subscriber = commonEventSubscriber; 
  //订阅公共事件 
  try { 
    CommonEventManager.subscribe(subscriber, (err,data)=> { 
      console.info(tag+"createSubscriberCallBack1"+JSON.stringify(data)) 
    }); 
  } catch (err) { 
    console.error("createSubscriber failed " + JSON.stringify(err)); 
  } 
} 
 
//创建订阅者 
try { 
  CommonEventManager.createSubscriber(subscribeInfo, createSubscriberCallBack); 
} catch (err) { 
  console.error('createSubscriber failed, catch error' + JSON.stringify(err)); 
}

4.发布公共事件

1.发布不携带信息的公共事件

// 公共事件相关信息 
let options = { 
  code: 1, // 公共事件的初始代码 
} 
 
// 发布公共事件 
commonEvent.publish("usual.event.SCREEN_OFF", options, (err) => { 
  if (err) { 
    console.error('[CommonEvent] PublishCallBack err=' + JSON.stringify(err)); 
  } else { 
    console.info('[CommonEvent] Publish success') 
  } 
})

2.发布携带信息的公共事件

// 公共事件相关信息 
let options = { 
  code: 1, // 公共事件的初始代码 
  data: "initial data", // 公共事件的初始数据 
} 
 
// 发布公共事件 
commonEvent.publish("usual.event.SCREEN_OFF", options, (err) => { 
  if (err) { 
    console.error('[CommonEvent] PublishCallBack err=' + JSON.stringify(err)); 
  } else { 
    console.info('[CommonEvent] Publish success') 
  } 
})
分享
微博
QQ
微信
回复
2024-05-29 22:04:35
相关问题
用户订阅系统公共事件
1098浏览 • 1回复 待解决
公共事件实现跨进程通信
853浏览 • 1回复 待解决
如何把公共事件发布给其他设备
4296浏览 • 1回复 待解决
公共事件的生命周期是怎样的
1563浏览 • 1回复 待解决
uiTest使用问题哪些
329浏览 • 1回复 待解决
List使用问题哪些
323浏览 • 1回复 待解决
Marquee组件使用问题哪些
335浏览 • 0回复 待解决
WaterFlow的使用范例哪些
916浏览 • 1回复 待解决
LazyForEach的使用限制哪些
575浏览 • 1回复 待解决
使用具体的类型哪些
187浏览 • 1回复 待解决
HarmonyOS 如何简单使用全局变量?
420浏览 • 1回复 待解决