发布公共事件(C/C++)
场景介绍
当需要发布某个公共事件时,可以通过OH_CommonEvent_Publish和OH_CommonEvent_PublishWithInfo方法发布事件。发布的公共事件可以携带数据,供订阅者解析并进行下一步处理。
接口说明
详细的API说明请参考oh_commonevent.h。
开发步骤
-
引用头文件。
#include <cstdint>#include <cstring>#include "hilog/log.h"#include "BasicServicesKit/oh_commonevent.h"const long PARAM_LONG_VALUE1 = 2147483646;const long PARAM_LONG_VALUE2 = 2147483645;const long PARAM_LONG_VALUE3 = 555;const double PARAM_DOUBLE_VALUE1 = 11.22;const double PARAM_DOUBLE_VALUE2 = 33.44;const double PARAM_DOUBLE_VALUE3 = 55.66;const int PARAM_INT_VALUE1 = 10;const int PARAM_INT_VALUE2 = 123;const int PARAM_INT_VALUE3 = 234;const int PARAM_INT_VALUE4 = 567; -
在CMake脚本中添加动态链接库。
target_link_libraries(entry PUBLIClibace_napi.z.solibhilog_ndk.z.solibohcommonevent.so) -
(可选)创建公共事件属性对象。
发布携带数据的公共事件时,需要通过OH_CommonEvent_CreatePublishInfo创建公共事件属性对象,并通过以下接口设置公共事件属性。
// 创建并添加公共事件属性附加信息CommonEvent_Parameters *CreateParameters(){int32_t ret = -1;// 创建公共事件附加信息CommonEvent_Parameters *param = OH_CommonEvent_CreateParameters();// 设置int类型附加信息和keyret = OH_CommonEvent_SetIntToParameters(param, "intKey", PARAM_INT_VALUE1);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetIntToParameters ret <%{public}d>.", ret);// 设置int数组类型附加信息和keyint intArray[] = {PARAM_INT_VALUE2, PARAM_INT_VALUE3, PARAM_INT_VALUE4};size_t arraySize = sizeof(intArray) / sizeof(intArray[0]);ret = OH_CommonEvent_SetIntArrayToParameters(param, "intArrayKey", intArray, arraySize);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetIntArrayToParameters ret <%{public}d>.", ret);// 设置long类型附加信息和keyret = OH_CommonEvent_SetLongToParameters(param, "longKey", PARAM_LONG_VALUE1);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetLongToParameters ret <%{public}d>.", ret);// 设置long数组类型附加信息和keylong longArray[] = {PARAM_LONG_VALUE1, PARAM_LONG_VALUE3, PARAM_LONG_VALUE2};ret = OH_CommonEvent_SetLongArrayToParameters(param, "longArrayKey", longArray, arraySize);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetLongArrayToParameters ret <%{public}d>.", ret);// 设置double类型附加信息和keyret = OH_CommonEvent_SetDoubleToParameters(param, "doubleKey", PARAM_DOUBLE_VALUE1);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetDoubleToParameters ret <%{public}d>.", ret);// 设置double数组类型附加信息和keydouble doubleArray[] = {PARAM_DOUBLE_VALUE1, PARAM_DOUBLE_VALUE2, PARAM_DOUBLE_VALUE3};ret = OH_CommonEvent_SetDoubleArrayToParameters(param, "doubleArrayKey", doubleArray, arraySize);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetDoubleArrayToParameters ret <%{public}d>.", ret);// 设置boolean类型附加信息和keyret = OH_CommonEvent_SetBoolToParameters(param, "boolKey", true);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetBoolToParameters ret <%{public}d>.", ret);// 设置boolean数组类型附加信息和keybool boolArray[] = {true, false, true};ret = OH_CommonEvent_SetBoolArrayToParameters(param, "boolArrayKey", boolArray, arraySize);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetBoolArrayToParameters ret <%{public}d>.", ret);// 设置char类型附加信息和keyret = OH_CommonEvent_SetCharToParameters(param, "charKey", 'A');OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetCharToParameters ret <%{public}d>.", ret);// 设置char数组类型附加信息和keyconst char *value = "Char Array";size_t valueLength = strlen(value);ret = OH_CommonEvent_SetCharArrayToParameters(param, "charArrayKey", value, valueLength);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetCharArrayToParameters ret <%{public}d>.", ret);return param;}// 设置公共事件属性void SetPublishInfo(const char *bundleName, const char *permissions[], int32_t num, const int32_t code,const char *data){int32_t ret = -1;// 创建publishInfo,设置是否为有序公共事件,取值为true,表示有序公共事件;取值为false,表示无序公共事件CommonEvent_PublishInfo *info = OH_CommonEvent_CreatePublishInfo(true);// 设置公共事件包名称ret = OH_CommonEvent_SetPublishInfoBundleName(info, bundleName);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetPublishInfoBundleName ret <%{public}d>.", ret);// 设置公共事件权限,参数为权限数组和权限的数量ret = OH_CommonEvent_SetPublishInfoPermissions(info, permissions, num);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetPublishInfoPermissions ret <%{public}d>.", ret);// 设置公共事件结果码ret = OH_CommonEvent_SetPublishInfoCode(info, code);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetPublishInfoCode ret <%{public}d>.", ret);// 设置公共事件结果数据size_t dataLength = strlen(data);ret = OH_CommonEvent_SetPublishInfoData(info, data, dataLength);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetPublishInfoData ret <%{public}d>.", ret);// 设置公共事件附加信息CommonEvent_Parameters *param = CreateParameters();ret = OH_CommonEvent_SetPublishInfoParameters(info, param);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_SetPublishInfoParameters ret <%{public}d>.", ret);} -
发布公共事件。
-
通过OH_CommonEvent_Publish发布不携带信息的公共事件。
不携带信息的公共事件,只能发布为无序公共事件。
void Publish(const char *event){int32_t ret = OH_CommonEvent_Publish(event);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_Publish ret <%{public}d>.", ret);} -
通过OH_CommonEvent_PublishWithInfo发布携带信息的公共事件。
void PublishWithInfo(const char *event, CommonEvent_PublishInfo *info){// 创建时带入公共事件属性对象int32_t ret = OH_CommonEvent_PublishWithInfo(event, info);OH_LOG_Print(LOG_APP, LOG_INFO, 1, "CES_TEST", "OH_CommonEvent_PublishWithInfo ret <%{public}d>.", ret);}
-
-
销毁公共事件对象。
如果后续无需使用已创建的公共事件对象来发布公共事件,需要先通过OH_CommonEvent_DestroyParameters销毁CommonEvent_Parameters对象,然后再通过OH_CommonEvent_DestroyPublishInfo销毁公共事件对象。
void DestroyPublishInfo(CommonEvent_Parameters *param, CommonEvent_PublishInfo *info){// 先销毁ParametersOH_CommonEvent_DestroyParameters(param);param = nullptr;// 销毁PublishInfoOH_CommonEvent_DestroyPublishInfo(info);info = nullptr;}