#跟着若城学鸿蒙# HarmonyOS进程间通信的公共事件机制介绍
公共事件管理模块是HarmonyOS中用于实现进程间通信(IPC)的重要机制之一。通过公共事件服务(Common Event Service, CES),应用程序可以方便地在不同应用或同一应用的不同组件之间进行信息交换,而无需直接调用彼此。这种机制不仅提高了系统的灵活性和可扩展性,也为开发者提供了一种高效的方式来处理跨进程通信的需求。
本文将详细介绍公共事件管理模块的功能和使用方法,包括如何发布、订阅和退订公共事件。我们还将探讨公共事件的分类及其不同的发送方式,帮助您更好地理解其应用场景和特点。最后,我们将提供一些实用的学习资源和建议,帮助您掌握这一关键的技术模块。
公共事件管理模块
公共事件管理模块通过公共事件服务(Common Event Service, CES)为应用程序提供订阅、发布和退订公共事件的能力。公共事件主要用于进程间通信(IPC),使得不同应用或同一应用的不同组件可以在不直接调用彼此的情况下进行信息交换。
公共事件分类
公共事件可以根据其来源和发送方式分为不同的类别。
系统公共事件
系统公共事件是由系统服务或系统应用内部定义并发布的事件。当前仅支持系统应用和系统服务发布系统公共事件,例如HAP安装、更新、卸载等。这些事件的完整列表请参见系统公共事件定义。
自定义公共事件
自定义公共事件是由开发者在应用中定义的,用于实现跨进程的事件通信能力。这些事件可以由任何应用发布,并被其他应用订阅,从而实现应用之间的信息交换。
公共事件按发送方式分类
公共事件还可以根据其发送方式分为无序公共事件、有序公共事件和粘性公共事件。
无序公共事件
无序公共事件在转发时,CES不考虑订阅者是否接收到该事件,也不保证事件的接收顺序与其订阅顺序一致。这种类型的公共事件适用于不需要特定顺序处理的场景。
有序公共事件
有序公共事件在转发时,根据订阅者设置的优先级等级,优先将事件发送给优先级较高的订阅者。一个订阅者成功接收该事件后,事件才会转发给优先级较低的订阅者。如果有多个订阅者具有相同的优先级,则他们将随机接收到公共事件。这种类型的公共事件适用于需要按优先级顺序处理的场景。
粘性公共事件
粘性公共事件允许订阅者在订阅前也能接收到已经发布的公共事件。普通的公共事件只能在订阅后才能接收到。粘性公共事件支持先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,并且发送者需要申请ohos.permission.COMMONEVENT_STICKY
权限。更多关于声明权限的信息,请参见权限声明。
导入模块
import CommonEventManager from '@ohos.commonEventManager';
运作机制
每个应用可以根据需要订阅公共事件。当公共事件发布时,系统会将其发送给对应的订阅应用。这些公共事件可能来自系统、其他应用或应用自身。
发布公共事件
使用回调形式发布无序公共事件
import Base from '@ohos.base';
// 发布公共事件回调函数
function publishCB(err) {
if (err) {
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("publish");
}
}
// 发布公共事件
try {
CommonEventManager.publish("event", publishCB);
} catch (error) {
let err = error;
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
}
使用回调形式并指定发布信息
import Base from '@ohos.base';
// 公共事件相关信息
let options = {
code: 0,
data: "initial data",
isOrdered: true
};
// 发布公共事件回调函数
function publishCB(err) {
if (err) {
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("publish");
}
}
// 发布公共事件
try {
CommonEventManager.publish("event", options, publishCB);
} catch (error) {
let err = error;
console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
}
使用回调形式发布给指定用户
import Base from '@ohos.base';
// 发布公共事件回调函数
function publishCB(err) {
if (err) {
console.error(`publishAsUser failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("publishAsUser");
}
}
// 指定发送的用户ID
let userId = 100;
// 发布公共事件
try {
CommonEventManager.publishAsUser("event", userId, publishCB);
} catch (error) {
let err = error;
console.error(`publishAsUser failed, code is ${err.code}, message is ${err.message}`);
}
使用回调形式并指定发布信息给指定用户
import Base from '@ohos.base';
// 公共事件相关信息
let options = {
code: 0,
data: "initial data"
};
// 发布公共事件回调函数
function publishCB(err) {
if (err) {
console.error(`publishAsUser failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("publishAsUser");
}
}
// 指定发送的用户ID
let userId = 100;
// 发布公共事件
try {
CommonEventManager.publishAsUser("event", userId, options, publishCB);
} catch (error) {
let err = error;
console.error(`publishAsUser failed, code is ${err.code}, message is ${err.message}`);
}
创建订阅者
使用回调形式创建订阅者
import Base from '@ohos.base';
let subscriber; // 保存创建成功的订阅者对象
// 订阅者信息
let subscribeInfo = {
events: ["event"]
};
// 创建订阅者回调函数
function createCB(err, commonEventSubscriber) {
if (err) {
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("createSubscriber");
subscriber = commonEventSubscriber;
}
}
// 创建订阅者
try {
CommonEventManager.createSubscriber(subscribeInfo, createCB);
} catch (error) {
let err = error;
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
}
使用Promise形式创建订阅者
import Base from '@ohos.base';
let subscriber; // 保存创建成功的订阅者对象
// 订阅者信息
let subscribeInfo = {
events: ["event"]
};
// 创建订阅者
CommonEventManager.createSubscriber(subscribeInfo)
.then((commonEventSubscriber) => {
console.info("createSubscriber");
subscriber = commonEventSubscriber;
})
.catch((err) => {
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
});
订阅公共事件
import Base from '@ohos.base';
let subscriber; // 保存创建成功的订阅者对象
// 订阅者信息
let subscribeInfo = {
events: ["event"]
};
// 订阅公共事件回调函数
function subscribeCB(err, data) {
if (err) {
console.error(`subscribe failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("subscribe");
}
}
// 创建订阅者回调函数
function createCB(err, commonEventSubscriber) {
if (err) {
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("createSubscriber");
subscriber = commonEventSubscriber;
// 订阅公共事件
try {
CommonEventManager.subscribe(subscriber, subscribeCB);
} catch (error) {
let err = error;
console.error(`subscribe failed, code is ${err.code}, message is ${err.message}`);
}
}
}
// 创建订阅者
try {
CommonEventManager.createSubscriber(subscribeInfo, createCB);
} catch (error) {
let err = error;
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
}
取消订阅公共事件
import Base from '@ohos.base';
let subscriber; // 保存创建成功的订阅者对象
// 取消订阅公共事件回调函数
function unsubscribeCB(err) {
if (err) {
console.error(`unsubscribe failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("unsubscribe");
}
}
// 订阅者信息
let subscribeInfo = {
events: ["event"]
};
// 订阅公共事件回调函数
function subscribeCB(err, data) {
if (err) {
console.error(`subscribe failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("subscribe");
}
}
// 创建订阅者回调函数
function createCB(err, commonEventSubscriber) {
if (err) {
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info("createSubscriber");
subscriber = commonEventSubscriber;
// 订阅公共事件
try {
CommonEventManager.subscribe(subscriber, subscribeCB);
} catch (error) {
let err = error;
console.error(`subscribe failed, code is ${err.code}, message is ${err.message}`);
}
// 取消订阅公共事件
setTimeout(() => {
try {
CommonEventManager.unsubscribe(subscriber, unsubscribeCB);
} catch (error) {
let err = error;
console.error(`unsubscribe failed, code is ${err.code}, message is ${err.message}`);
}
}, 500);
}
}
// 创建订阅者
try {
CommonEventManager.createSubscriber(subscribeInfo, createCB);
} catch (error) {
let err = error;
console.error(`createSubscriber failed, code is ${err.code}, message is ${err.message}`);
}
移除粘性公共事件
使用回调形式移除粘性公共事件
import Base from '@ohos.base';
CommonEventManager.removeStickyCommonEvent("sticky_event", (err) => {
if (err) {
console.info(`Remove sticky event AsyncCallback failed, errCode: ${err.code}, errMes: ${err.message}`);
return;
}
console.info(`Remove sticky event AsyncCallback success`);
});
使用Promise形式移除粘性公共事件
import Base from '@ohos.base';
CommonEventManager.removeStickyCommonEvent("sticky_event")
.then(() => {
console.info(`Remove sticky event AsyncCallback success`);
})
.catch((err) => {
console.info(`Remove sticky event AsyncCallback failed, errCode: ${err.code}, errMes: ${err.message}`);
});
总结
公共事件管理模块通过公共事件服务(CES)为应用程序提供了一种强大的进程间通信机制,使得应用之间可以方便地进行信息交换。系统公共事件和自定义公共事件分别用于系统内部的通信和应用之间的通信。无序公共事件、有序公共事件和粘性公共事件则提供了不同的事件发送和接收方式,以满足不同的业务需求。
更多推荐
所有评论(0)