当前位置: 首页 > news >正文

OpenHarmony的公共事件

OpenHarmony的公共事件

公共事件简介

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

公共事件分类

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

  • 系统公共事件:CES内部定义的公共事件,当前仅支持系统应用和系统服务发布,例如HAP安装、更新、卸载等公共事件。目前支持的系统公共事件请参见系统公共事件列表。
  • 自定义公共事件:应用定义的公共事件,可用于实现跨进程的事件通信能力。
    公共事件按发送方式可分为:无序公共事件、有序公共事件和粘性公共事件。
  • 无序公共事件:CES在转发公共事件时,不考虑订阅者是否接收到该事件,也不保证订阅者接收到该事件的顺序与其订阅顺序一致。
  • 有序公共事件:CES在转发公共事件时,根据订阅者设置的优先级等级,优先将公共事件发送给优先级较高的订阅者,等待其成功接收该公共事件之后再将事件发送给优先级较低的订阅者。如果有多个订阅者具有相同的优先级,则他们将随机接收到公共事件。
  • 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,粘性事件发送后会一直存在系统中,且发送者需要申请ohos.permission.COMMONEVENT_STICKY权限,配置方式请参见声明权限。

运作机制

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

安全注意事项

  • 公共事件发布方:如果不加限制,任何应用都可以订阅公共事件并读取相关信息,应避免在公共事件中携带敏感信息。采用以下方式,可以限制公共事件接收方的范围。
    • 通过CommonEventPublishData中的subscriberPermissions参数指定订阅者所需权限。
    • 通过CommonEventPublishData中的bundleName参数指定订阅者的包名。
  • 公共事件订阅方:订阅自定义公共事件后,任意应用都可以向订阅者发送潜在的恶意公共事件。采用以下方式,可以限制公共事件发布方的范围。
    • 通过CommonEventSubscribeInfo中的publisherPermission参数指定发布者所需权限。
    • 通过CommonEventSubscribeInfo中的publisherBundleName参数参数指定发布者的包名。
  • 自定义公共事件名称应确保全局唯一,否则可能与其他公共事件冲突。

常用的公共事件

公共事件类型定义在ohos.commonEventManager模块的Support枚举中。

事件名称功能描述
COMMON_EVENT_POWER_CONNECTED设备连接到外部电源的公共事件的动作
COMMON_EVENT_POWER_DISCONNECTED设备与外部电源断开的公共事件的动作
COMMON_EVENT_CHARGING表示系统开始为电池充电的公共事件的动作
COMMON_EVENT_DISCHARGING表示系统停止为电池充电的公共事件的动作
COMMON_EVENT_SHUTDOWN表示设备正在关闭并将继续最终关闭的公共事件的操作
COMMON_EVENT_SCREEN_ON表示由电源服务发起的设备亮屏完成的普通事件的动作
COMMON_EVENT_SCREEN_OFF表示由电源服务发起的设备灭屏完成的普通事件的动作
COMMON_EVENT_WIFI_POWER_STATEWi-Fi开关状态变化
COMMON_EVENT_SCREEN_LOCKED表示屏幕锁定的公共事件
COMMON_EVENT_SCREEN_UNLOCKED表示屏幕解锁的公共事件
COMMON_EVENT_BATTERY_CHANGED表示电池充电状态、电平和其他信息发生变化的公共事件的动作
COMMON_EVENT_USB_DEVICE_ATTACHED当用户设备作为USB主机时,提示USB设备已挂载
COMMON_EVENT_USB_DEVICE_DETACHED当用户设备作为USB主机时,提示USB设备被卸载
其中上面的屏幕亮屏和灭屏,屏幕锁屏和解锁,接电源适配器和拔掉电源适配器、开启wifi和断开wifi、插入USB设备/拔掉USB设备等。其中对于手机、平板、PC来说,上面的几个事件都比较常用,尤其在设备后台灭屏降功耗的时候比较有用。COMMON_EVENT_POWER_CONNECTED/COMMON_EVENT_POWER_DISCONNECTED这两个事件对于手机和平板来说就是接电源和拔掉电源,在PC中就是AC和DC了。

资源调度服务中的事件转换

resource_schedule_service开源仓地址:https://gitee.com/openharmony/resourceschedule_resource_schedule_service
在资源调度子系统中,提供系统事件的感知以及分发,例如应用启动、退出、亮灭屏等。如果需要获取系统事件,并且进行相关资源调度,那么可以选择以插件形式加入资源调度服务中。

作为资源调度子系统的子模块,智能分组模块通过系统内应用前后台切换、用户焦点输入、后台任务的执行状态,决策进程的分组调度策略,并支持通过配置将调度策略映射到不同的CGROUP分组,为系统的性能、功耗均衡调度提供决策依据。同时该模块向资源调度框架转发应用状态、焦点状态、后台任务状态等系统事件,供插件订阅。

resource_schedule_service是接收事件,决策调度策略和执行调度机制的引擎,其架构图示如下:
资源调度服务架构图
其中包括以下几个重要组成部分: 1、事件管理器,包含了使用对外接口直接感知系统事件,以及使用监听形式感知系统事件功能。 2、应用智能分组,该组件接收应用生命周期变更的事件,决策应用的分组优先级,是全局资源调度的根本依据。 3、插件管理器,负责产品对应资源调度插件的加载,接收系统和应用的事件,并根据插件的订阅情况将事件分发给插件。 4、SOC统一调频服务,该服务主要是从SOC统一调频插件中接收调频事件,进行相关的调频仲裁,最终使用内核接口设置CPU频率策略。

resource_schedule_service主要通过插件的形式进行扩展和实现系统全局资源的调度功能,插件以动态链接的形式运行,不同产品可以选择不同的插件进行加载。目前已知的插件有智能感知调度插件、设备状态管理插件、SOC统一调频插件。其中SOC统一调频插件的服务包含在resource_schedule_service中,而另外两个插件的服务包含在其它仓内,最终都是根据系统事件设置调度策略到内核中进行实施。

1:插件Check_List

更新2022年2月18日14:35:24

插件名插件功能简介插件订阅事件进程基线内存(KB)插件内存基线(KB)插件的事件执行效率插件新增线程插件关联进程插件需要的权限插件负责人
soc_perfcpu提频RES_TYPE_APP_STATE_CHANGE; RES_TYPE_WINDOW_FOCUS; RES_TYPE_CLICK_RECOGNIZE;RES_TYPE_PUSH_PAGE; RES_TYPE_SLIDE_RECOGNIZE;常驻:5918 动态:5922常驻:88 动态:88socperf_serviceHaoyangT
frame_aware_sched智能感知调度RES_TYPE_WINDOW_FOCUS; RES_TYPE_PROCESS_STATE_CHANGE; RES_TYPE_APP_STATE_CHANGE常驻:4537常驻:109暂无rongkunshi
component_sched外设调度RES_TYPE_SCREEN_STATUS;RES_TYPE_APP_STATE_CHANGE;RES_TYPE_ABILITY_STATE_CHANGE;RES_TYPE_EXTENSION_STATE_CHANGE;RES_TYPE_PROCESS_STATE_CHANGE;RES_TYPE_WINDOW_FOCUS; RES_TYPE_DEVICE_STILL_STATE_CHANGE;常驻:常驻: 动态:暂无linyunxuan
事件Check_List

更新2022年6月01日14:35:24

事件type事件用途事件value事件payload格式事件打点延时:订阅事件插件
RES_TYPE_SCREEN_STATUS屏幕状态0:屏幕暗 1:屏幕亮无需payload
RES_TYPE_APP_STATE_CHANGEAPP状态改变事件value : app state{“pid”=?,“uid”=?,“bundleName”=“?”}<10mssoc_perf; frame_aware
RES_TYPE_ABILITY_STATE_CHANGEABILITY状态改变事件value : ability state{“pid”=?,“uid”=?,“bundleName”=“?”}
RES_TYPE_EXTENSION_STATE_CHANGEEXTENSION状态改变事件value :extension state{“pid”=?,“uid”=?,“bundleName”=“?”}
RES_TYPE_PROCESS_STATE_CHANGE进程状态事件0:创建 1:销毁{“pid”=?,“uid”=?,“bundleName”=“?”}<10msframe_aware
RES_TYPE_WINDOW_FOCUS窗口聚焦事件0:聚焦1:不聚焦{“pid”=?,“uid”=?,“bundleName”=“?”, “windowId”=?,“windowType”=?,displayId=?}<10mssoc_perf ; frame_aware
RES_TYPE_TRANSIENT_TASK瞬态任务事件0:开始 1:结束{“pid”=?,“uid”=?,“bundleName”=“?”}
RES_TYPE_CONTINUOUS_TASK长时任务事件0:开始 1:结束{“pid”=?,“uid”=?,“abilityName”=“?”}
RES_TYPE_CGROUP_ADJUSTERcgroup改变事件0: 进程组分组变化 1: 线程分组变化{“pid”=?,“uid”=?,“name”=“?”,“oldGroup”=?, “newGroup”=?}
RES_TYPE_CLICK_RECOGNIZEace手势点击识别器<10mssoc_perf
RES_TYPE_PUSH_PAGEace pipeline_context.cpp::PushPage()<10mssoc_perf
RES_TYPE_SLIDE_RECOGNIZEace slide event recognize1: list fling on; 0: list fling off; 3: slide normal begin, 4: slide normal end<10mssoc_perf
RES_TYPE_WINDOW_VISIBILITY_CHANGE窗口可见性状态变化事件1: 可见, 0: 不可见--
RES_TYPE_REPORT_MMI_PROCESS上报mmi_service线程IDmmi_service线程号{“uid”=?, “pid”=?}--
RES_TYPE_REPORT_RENDER_THREAD上报应用的RSRender线程IDRSRenderThread线程号{“uid”=?, “pid”=?}--
RES_TYPE_APP_INSTALL_UNINSTALL应用安装和卸载事件value 0: 卸载, 1: 安装{“uid”=?,“bundleName”="?}--
RES_TYPE_WIFI_CONNECT_STATE_CHANGEwifi连接状态事件1:空闲, 2:连接中, 3:已连接, 4:断开中, 5:已断开无需payload--
RES_TYPE_USER_SWITCH用户切换事件value: 切换到的目标用户id无需payload--
RES_TYPE_USER_REMOVE用户删除事件value: 删除的用户id无需payload--
RES_TYPE_SCREEN_LOCK锁屏和解锁事件0:解锁 1:锁屏无需payload--
RES_TYPE_CALL_STATE_UPDATE电话状态改变事件value:电话状态无需payload--
RES_TYPE_AUDIO_RENDER_STATE_CHANGE音频流状态改变事件value:音频流状态{“uid”=?,“sessionId”=?}--
RES_TYPE_AUDIO_RING_MODE_CHANGE声音模式改变事件0:响铃模式 1:静音模式无需payload--
RES_TYPE_AUDIO_VOLUME_KEY_CHANGE音量改变事件value:音量大小{“volumeType”=?}--
RES_TYPE_POP_PAGEace pipeline_context.cpp::PopPage();{“pid”=?,“uid”=?,“bundleName”=“?”,“abilityName”=“?”, “pageUrl”=“?”}--
RES_TYPE_WEB_GESTUREweb手势事件--
RES_TYPE_SHOW_REMOTE_ANIMATION动画开始事件0:动画开始 1:动画结束{“srcPid”=?}--
RES_TYPE_DEVICE_STILL_STATE_CHANGE当前设备运动状态和静止状态转变事件-1: 无效值,0: 转变为运动状态,1:转变为静止状态--
RES_TYPE_RESIZE_WINDOW窗口缩放事件0: 窗口缩放开始,1:窗口缩放结束--
RES_TYPE_MOVE_WINDOW窗口拖拽事件0: 窗口拖拽开始,1:窗口拖拽结束--
RES_TYPE_LOAD_PAGE页面加载事件0: 页面加载开始,1:页面加载结束--
RES_TYPE_DRAG_STATUS_BAR状态栏下拉事件0:状态栏下拉开始, 1:状态栏下拉结束--
RES_TYPE_REPORT_SCENE_BOARD报告sceneBoard进程信息进程PID{“uid”=?, “mainTid”=?, “bundleName”=?}--
RES_TYPE_REPORT_KEY_THREAD报告关键线程0:新增,1:删除{“uid”=?, “pid”=?, “tid”=?, “role”=?}--
RES_TYPE_REPORT_WINDOW_STATE报告窗口状态0:新增,1:删除{“uid”=?, “pid”=?, “windowId”=?, “serialNum”=?, “state”=0 active 1 inactive}--
RES_TYPE_REPORT_SCENE_SCHED报告场景状态0:场景进入,1:场景退出{“uid”=?, “sceneId”=?,}--

通过查看https://gitee.com/openharmony/resourceschedule_resource_schedule_service中的源代码,我们可以看到event_controller.cpp中的void EventController::SystemAbilityStatusChangeListener::OnAddSystemAbility( int32_t systemAbilityId, const std::string& deviceId)接口中,添加了需要监听的公共事件,代码如下:

void EventController::SystemAbilityStatusChangeListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
{RESSCHED_LOGI("common event service is added");MatchingSkills matchingSkills;matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_CONNECTIVITY_CHANGE);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_INSTALLATION_STARTED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_REPLACED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_SCREEN_ON);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_SCREEN_OFF);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_USER_SWITCHED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_USER_REMOVED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_BUNDLE_REMOVED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_FULLY_REMOVED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_TIME_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_NITZ_TIME_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_NITZ_TIMEZONE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_CHARGING);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_DISCHARGING);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_WIFI_P2P_STATE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_POWER_SAVE_MODE_CHANGED);matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED);matchingSkills.AddEvent(DATA_SHARE_READY);CommonEventSubscribeInfo subscriberInfo(matchingSkills);subscriber_ = std::make_shared<EventController>(subscriberInfo);SubscribeCommonEvent(subscriber_);SubscribeLockScreenCommonEvent();
}void EventController::SystemAbilityStatusChangeListener::SubscribeLockScreenCommonEvent()
{MatchingSkills lockScreenSkills;lockScreenSkills.AddEvent("common.event.UNLOCK_SCREEN");lockScreenSkills.AddEvent("common.event.LOCK_SCREEN");CommonEventSubscribeInfo subscriberInfo(lockScreenSkills);subscriberInfo.SetPublisherBundleName(SCENE_BOARD_NAME);lockScreenSubscriber_ = std::make_shared<EventController>(subscriberInfo);SubscribeCommonEvent(lockScreenSubscriber_);
}inline void SubscribeCommonEvent(std::shared_ptr<EventController> subscriber)
{if (CommonEventManager::SubscribeCommonEvent(subscriber)) {RESSCHED_LOGI("SubscribeCommonEvent ok");} else {RESSCHED_LOGW("SubscribeCommonEvent fail");HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,"COMPONENT_NAME", "MAIN","ERR_TYPE", "register failure","ERR_MSG", "EventController subscribe common events failed!");}
}

另外,资源调度服务部件是通过`void EventController::OnReceiveEvent(const EventFwk::CommonEventData &data)'这个函数接口中转换公共事件到自定义枚举事件的,代码如下:

void EventController::OnReceiveEvent(const EventFwk::CommonEventData &data)
{Want want = data.GetWant();std::string action = want.GetAction();RESSCHED_LOGI("Recieved common event:%{public}s", action.c_str());nlohmann::json payload = nlohmann::json::object();if (HandlePkgCommonEvent(action, want, payload)) {return;}if (action == CommonEventSupport::COMMON_EVENT_SCREEN_ON) {ReportDataInProcess(ResType::RES_TYPE_SCREEN_STATUS, ResType::ScreenStatus::SCREEN_ON, payload);return;}if (action == CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {ReportDataInProcess(ResType::RES_TYPE_SCREEN_STATUS, ResType::ScreenStatus::SCREEN_OFF, payload);return;}if (action == CommonEventSupport::COMMON_EVENT_CONNECTIVITY_CHANGE) {int32_t code = data.GetCode();HandleConnectivityChange(want, code, payload);return;}if (action == CommonEventSupport::COMMON_EVENT_USER_SWITCHED) {int32_t userId = data.GetCode();ReportDataInProcess(ResType::RES_TYPE_USER_SWITCH, static_cast<int64_t>(userId), payload);return;}if (action == CommonEventSupport::COMMON_EVENT_USER_REMOVED) {int32_t userId = data.GetCode();ReportDataInProcess(ResType::RES_TYPE_USER_REMOVE, static_cast<int64_t>(userId), payload);return;}if (action == "common.event.UNLOCK_SCREEN") {ReportDataInProcess(ResType::RES_TYPE_SCREEN_LOCK, ResType::ScreenLockStatus::SCREEN_UNLOCK, payload);return;}if (action == "common.event.LOCK_SCREEN") {ReportDataInProcess(ResType::RES_TYPE_SCREEN_LOCK, ResType::ScreenLockStatus::SCREEN_LOCK, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED) {payload["state"] = want.GetIntParam("state", -1);ReportDataInProcess(ResType::RES_TYPE_CALL_STATE_CHANGED, static_cast<int64_t>(data.GetCode()), payload);return;}if (action == DATA_SHARE_READY) {DataShareIsReady();return;}handleEvent(data.GetCode(), action, payload);
}void EventController::handleEvent(int32_t userId, const std::string &action, nlohmann::json &payload)
{if (action == CommonEventSupport::COMMON_EVENT_TIMEZONE_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_TIMEZONE_CHANGED, ResType::RES_TYPE_TIMEZONE_CHANGED, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_TIME_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_TIME_CHANGED, static_cast<int64_t>(userId), payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_NITZ_TIME_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_NITZ_TIME_CHANGED, static_cast<int64_t>(userId), payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_NITZ_TIMEZONE_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_NITZ_TIMEZONE_CHANGED, static_cast<int64_t>(userId), payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_CHARGING) {ReportDataInProcess(ResType::RES_TYPE_CHARGING_DISCHARGING, ResType::ChargeStatus::EVENT_CHARGING, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_DISCHARGING) {ReportDataInProcess(ResType::RES_TYPE_CHARGING_DISCHARGING, ResType::ChargeStatus::EVENT_DISCHARGING, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED) {ReportDataInProcess(ResType::RES_TYPE_USB_DEVICE, ResType::UsbDeviceStatus::USB_DEVICE_ATTACHED, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED) {ReportDataInProcess(ResType::RES_TYPE_USB_DEVICE, ResType::UsbDeviceStatus::USB_DEVICE_DETACHED, payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_WIFI_P2P_STATE_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_WIFI_P2P_STATE_CHANGED, static_cast<int64_t>(userId), payload);return;}if (action == EventFwk::CommonEventSupport::COMMON_EVENT_POWER_SAVE_MODE_CHANGED) {ReportDataInProcess(ResType::RES_TYPE_POWER_MODE_CHANGED, static_cast<int64_t>(userId), payload);return;}handleOtherEvent(userId, action, payload);
}void EventController::handleOtherEvent(int32_t userId, const std::string &action, nlohmann::json &payload)
{if (action == EventFwk::CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED) {RESSCHED_LOGI("report boot completed");ReportDataInProcess(ResType::RES_TYPE_BOOT_COMPLETED,ResType::BootCompletedStatus::START_BOOT_COMPLETED, payload);return;}
}

其中资源调度服务内部事件枚举定义如下:

namespace OHOS {
namespace ResourceSchedule {
namespace ResType {
enum : uint32_t {// first resTypeRES_TYPE_FIRST = 0,// screen status, value 0 means screen off, value 1 means screen on, else are invalid.RES_TYPE_SCREEN_STATUS = RES_TYPE_FIRST,// app state change event; value means app state; payload:pid,uid,bundleNameRES_TYPE_APP_STATE_CHANGE = 1,// ability state change event; value means ability state; payload:pid,uid,bundleNameRES_TYPE_ABILITY_STATE_CHANGE = 2,// extension state change event; value means extension state; payload:pid,uid,bundleNameRES_TYPE_EXTENSION_STATE_CHANGE = 3,// process state event; value 0:created, 1:died; payload:pid,uid,bundleNameRES_TYPE_PROCESS_STATE_CHANGE = 4,// window focused event; value 0:focused, 1:unfocused; payload:pid,uid,bundleName,windowId,windowType,displayIdRES_TYPE_WINDOW_FOCUS = 5,// transient task event; value 0:start, 1:finish; payload:pid,uid,bundleNameRES_TYPE_TRANSIENT_TASK = 6,// continuous task event; value 0:start, 1:finish; payload:pid,uid,abilityNameRES_TYPE_CONTINUOUS_TASK = 7,/* cgroup change event;* value 0:set thread group sched; 1:set thread sched* payload: pid,uid,name,oldGroup,newGroup*/RES_TYPE_CGROUP_ADJUSTER = 8,// ace gestures click_recognizer; value 1 touch event, value 2 click eventRES_TYPE_CLICK_RECOGNIZE = 9,// ace pipeline_context.cpp::PushPage(); value 0: push_page_start, 1: push_page_completeRES_TYPE_PUSH_PAGE = 10,// ace slide event recognize; value 1: list fling on; 0: list fling off; 3: slide normal begin, 4: slide normal end.RES_TYPE_SLIDE_RECOGNIZE = 11,// window visibility change, value 1: isVisible, 0: not isVisible, payload:pid,uid,windowId,windowTypeRES_TYPE_WINDOW_VISIBILITY_CHANGE = 12,// report mmi_service service; value mmi_service tid; payload:uid,pidRES_TYPE_REPORT_MMI_PROCESS = 13,// report render thread; value render tid; payload:uid,pidRES_TYPE_REPORT_RENDER_THREAD = 14,// app install and uninstall event; value 0: uninstall, 1: install; payload:uid,bundleNameRES_TYPE_APP_INSTALL_UNINSTALL = 15,// net connect state; value 0:unknow, 1:idle, 2:connecting, 3:connected, 4:disconnecting, 5:disconnectedRES_TYPE_WIFI_CONNECT_STATE_CHANGE = 16,// user switch, value means the userId which switch to.RES_TYPE_USER_SWITCH = 17,// user remove, value means the userId which is removed.RES_TYPE_USER_REMOVE = 18,// screen unlock, value 0 means unlock, value 1 means locked.RES_TYPE_SCREEN_LOCK = 19,// bluetooth a2dp connect state, value 1: connected, 3: disconnected.RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE = 20,// network latency request, value 0: low latency, 1: normal latency, payload: identityRES_TYPE_NETWORK_LATENCY_REQUEST = 21,// call state update; value 0 : active, value 1 : holding, value 2 : dialing, value 3 : alerting,// value 4 : incoming, value 5 : waiting, value 6 : disconnected, value 7 : disconnecting, value 8 : idleRES_TYPE_CALL_STATE_UPDATE = 22,// Other process modify the thread Qos, value for client name id, payload: tid : qos , clientpid, pidRES_TYPE_THREAD_QOS_CHANGE = 23,// audio render state change; value -1 : RENDERER_INVALID, value 0 : RENDERER_NEW, value 1 : RENDERER_PREPARED,// value 2 : RENDERER_RUNNING, value 3 : RENDERER_STOPPED, value 4 : RENDERER_RELEASED, value 5 : RENDERER_PAUSED// payload:uid,sessionIdRES_TYPE_AUDIO_RENDER_STATE_CHANGE = 24,// audio ring mode change; value 0 : RINGER_MODE_NORMAL, value 1 : RINGER_MODE_SILENT// value 2 : RINGER_MODE_VIBRATERES_TYPE_AUDIO_RING_MODE_CHANGE = 25,RES_TYPE_AUDIO_VOLUME_KEY_CHANGE = 26,// app_ability_start_event : a very early app startup stub, when the app process has not been pulled up.// stub position : ability_runtime ability_manager_service.cpp::StartAbilityInner().// specifically : ability type is PAGE and ability launchMode is not SPECIFIED.RES_TYPE_APP_ABILITY_START = 27,// ace pipeline_context.cpp::PopPage(); value means nothingRES_TYPE_POP_PAGE = 28,// ace web gesture event recognize; value means nothingRES_TYPE_WEB_GESTURE = 29,// info from msdp, means device still state change(enter or exit)RES_TYPE_DEVICE_STILL_STATE_CHANGE = 30,// window resize event; value 0: resize window , value 1: stop resizing window.RES_TYPE_RESIZE_WINDOW = 31,// window move event; value 0: move window, value 1: stop moving window.RES_TYPE_MOVE_WINDOW = 32,// animation transition event; value 0: animation begin, value 1: animation end.RES_TYPE_SHOW_REMOTE_ANIMATION = 33,// load page; value 0: load page begin, value 1: load page end.RES_TYPE_LOAD_PAGE = 34,// report camera state, value 0: camera connect; value 1: camera disconnectRES_TYPE_REPORT_CAMERA_STATE = 35,// report runningLock state, value 0: runningLock disable; value 1: runningLock enable;// value 2: runningLock is proxied; value 3: runningLock is not proxiedRES_TYPE_RUNNINGLOCK_STATE = 36,// drag status bar event; value 0: start drag, value 1: stop drag.RES_TYPE_DRAG_STATUS_BAR = 37,// report SceneBoard service, value pid; payload:uid, main_tid, bundleNameRES_TYPE_REPORT_SCENE_BOARD = 38,// report key thread for render, value 0 add key Thread, 1 remove key thread, payload: uid, pid, tid, roleRES_TYPE_REPORT_KEY_THREAD = 39,// report window state, value 0 add 1 remove, payload: uid, pid, windowId, serialNum state: 0 active 1 inactiveRES_TYPE_REPORT_WINDOW_STATE = 40,// report scene sched, value 0 scene on 1 scene off, payload: uid, sceneIdRES_TYPE_REPORT_SCENE_SCHED = 41,// web gesture move event; value 0: web gesture move start, value 1: web gesture move end.RES_TYPE_WEB_GESTURE_MOVE = 42,// web slide normal event; value 0: web slide normal start, value 1: web slide normal end.RES_TYPE_WEB_SLIDE_NORMAL = 43,// load url event; value means nothing.RES_TYPE_LOAD_URL = 44,// mousewheel event; value means nothing.RES_TYPE_MOUSEWHEEL = 45,// report webview audio status, value 0 start 1 stop, payload: uid, pid, tidRES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE = 46,// report entering the multimodalinput state, value means subscribed multimodalinput state.RES_TYPE_MMI_INPUT_STATE = 47,// report anco load protect file configRES_TYPE_ANCO_CUST = 48,// report time zone changedRES_TYPE_TIMEZONE_CHANGED = 50,// report connection statusRES_TYPE_CONNECTION_OBSERVER = 51,// report av session create eventRES_TYPE_AV_SESSION_ON_SESSION_CREATE = 52,// report av session release eventRES_TYPE_AV_SESSION_ON_SESSION_RELEASE = 53,// report av session change eventRES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE = 54,// report OnAppStateChanged eventRES_TYPE_ON_APP_STATE_CHANGED = 55,// report efficiency resources eventRES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED = 56,// report av_codec state, value 0:codec start info, value 1:codec stop info.RES_TYPE_AV_CODEC_STATE = 57,// 58-64 value do not changeRES_TYPE_NITZ_TIME_CHANGED = 58,RES_TYPE_TIME_CHANGED = 59,RES_TYPE_NITZ_TIMEZONE_CHANGED = 60,RES_TYPE_CHARGING_DISCHARGING = 61,RES_TYPE_USB_DEVICE = 62,RES_TYPE_CALL_STATE_CHANGED = 63,RES_TYPE_WIFI_P2P_STATE_CHANGED = 64,// last resType//report app associated start to performance radarRES_TYPE_APP_ASSOCIATED_START = 65,//report thermal state eventRES_TYPE_THERMAL_STATE = 66,// socperf event beginRES_TYPE_SOCPERF_CUST_EVENT_BEGIN = 67,// socperf event endRES_TYPE_SOCPERF_CUST_EVENT_END = 68,// window drawing content change eventRES_TYPE_WINDOW_DRAWING_CONTENT_CHANGE = 69,// report vediuo capture start or stopRES_TYPE_REPORT_SCREEN_CAPTURE = 70,// report long frame, value 0 scene on 1 scene off.RES_TYPE_LONG_FRAME = 71,// report key perf scene, value 0 enter scene 1 exit scene.RES_TYPE_KEY_PERF_SCENE = 72,// report super launcher stateRES_TYPE_SUPER_LAUNCHER = 73,// report cast screen stateRES_TYPE_CAST_SCREEN = 74,// report screen collabroation stateRES_TYPR_SCREEN_COLLABROATION = 75,// report sa control app event, eg: start app or stop appRES_TYPE_SA_CONTROL_APP_EVENT = 76,// report CPU load of the entire machine,payload:cpuPercentRES_TYPE_SYSTEM_CPU_LOAD = 77,// report download or upload scene,value 0 enter scene 1 exit scene.RES_TYPE_UPLOAD_DOWNLOAD = 78,// report main screen split,value 0 enter scene 1 exit scene.RES_TYPE_SPLIT_SCREEN = 79,// report main screen floating window,value 0 enter scene 1 exit scene.RES_TYPE_FLOATING_WINDOW = 80,// report event distribute tid, value tid, payload uid, pid.RES_TYPE_REPORT_DISTRIBUTE_TID = 81,// report frame rateRES_TYPE_FRAME_RATE_REPORT = 82,// report web screen capture, value 0 start, value 1 stopRES_TYPE_WEBVIEW_SCREEN_CAPTURE = 83,// report video state. value 0 start playing, value 1 stop playingRES_TYPE_WEBVIEW_VIDEO_STATUS_CHANGE = 84,// report location status. value 0 app status, value 1 switch statusRES_TYPE_LOCATION_STATUS_CHANGE = 85,// report silent playbackRES_TYPE_AUDIO_SILENT_PLAYBACK = 86,// report display mode event, value status, payload mode.RES_TYPE_DEVICE_MODE_STATUS = 88,// report distribute component changeRES_TYPE_REPORT_DISTRIBUTE_COMPONENT_CHANGE = 89,// report web drag resizeRES_TYPE_WEB_DRAG_RESIZE = 90,// report formCard create start/endRES_TYPE_FORM_STATE_CHANGE_EVENT = 91,// report power mode changedRES_TYPE_POWER_MODE_CHANGED = 92,// report thermal scenario changedRES_TYPE_THERMAL_SCENARIO_REPORT = 93,// report boot completedRES_TYPE_BOOT_COMPLETED = 94,// report continuous application startupRES_TYPE_CONTINUOUS_STARTUP = 95,// report account activatingRES_TYPE_ACCOUNT_ACTIVATING = 96,// report silent playback in rendererRES_TYPE_AUDIO_RENDERER_SILENT_PLAYBACK = 97,// report continuous application installRES_TYPE_CONTINUOUS_INSTALL = 98,// report system updatedRES_TYPE_FIRST_BOOT_AFTER_SYSTEM_UPGRADE = 99,// report background perceivable sceneRES_TYPE_BACKGROUND_PERCEIVABLE_SCENE = 100,// user interaction sceneRES_TYPE_USER_INTERACTION_SCENE = 101,// report game sched, value 0 start, value 1 stopRES_TYPE_REPORT_GAME_SCHED = 102,// report send frame eventRES_TYPE_SEND_FRAME_EVENT = 103,// report app cold start only perf, value 0 start, value 1 stopRES_TYPE_ONLY_PERF_APP_COLD_START = 104,// report scene rotation, value 0 start, value 1 stopRES_TYPE_SCENE_ROTATION = 105,// report event vsync tid, value tid, payload pid, tid, uid.RES_TYPE_REPORT_VSYNC_TID = 106,// report cloud config updateRES_TYPE_CLOUD_CONFIG_UPDATE = 107,// system ability status changeRES_TYPE_SYSTEM_ABILITY_STATUS_CHANGE = 108,// mmi status changeRES_TYPE_MMI_STATUS_CHANGE = 109,// report media output device changeRES_TYPE_OUTPUT_DEVICE_CHANGE = 110,// report device idleRES_TYPE_DEVICE_IDLE = 111,// report media output device changeRES_TYPE_BT_SERVICE_EVENT = 112,// report to hisi, let bmm_report begin changeRES_TYPE_BMM_MONITER_CHANGE_EVENT = 113,// app frame drop eventRES_TYPE_APP_FRAME_DROP = 114,// report rss cloud config updateRES_TYPE_RSS_CLOUD_CONFIG_UPDATE = 115,// report game infoRES_TYPE_GAME_INFO_NOTIFY = 116,// report power key downRES_TYPE_MMI_INPUT_POWER_KEY = 117,// report application stoppedRES_TYPE_APP_STOPPED = 118,// last async resTypeASYNC_RES_TYPE_LAST,// first sync resTypeSYNC_RES_TYPE_FIRST = ASYNC_RES_TYPE_LAST,// thaw one applicationSYNC_RES_TYPE_THAW_ONE_APP,// get all suspend stateSYNC_RES_TYPE_GET_ALL_SUSPEND_STATE,// get thermal dataSYNC_RES_TYPE_GET_THERMAL_DATA,// check shoul force kill process,SYNC_RES_TYPE_SHOULD_FORCE_KILL_PROCESS,// report to request mutex statusSYNC_RES_TYPE_REQUEST_MUTEX_STATUS = 500,// report to check mutex before startSYNC_RES_TYPE_CHECK_MUTEX_BEFORE_START = 501,// last sync resTypeSYNC_RES_TYPE_LAST,// last resTypeRES_TYPE_LAST = SYNC_RES_TYPE_LAST,
};
} // namespace ResType
} // namespace ResourceSchedule
} // namespace OHOS

接着在调频插件socperf_plugin、待机插件device_standby_plugin、分组策略插件cgroup_sched_plugin中添加对资源调度内部事件的订阅和监听回调处理。
以上三个插件都分别实现了如下三个接口:

接口名接口描述
function OnPluginInit(std::string& libName): bool;插件初始化
function OnPluginDisable(): void;插件退出
function OnDispatchResource(const std::shared_ptr<ResData>& data):void;获取分发的事件

插件初始化的时候,指定需要注册监听的事件。在这些事件发生的时候,框架会依次分发给各个插件, 此时插件需要快速处理消息接收进行资源调度(需要有耗时任务则需另起线程处理),处理完成后返回。
插件事件处理约束

  • 1、插件可以用C/C++实现。
  • 2、插件的事件处理,必须快速完成,超过1ms会打印相关告警,超过10ms,框架认为插件异常而进行插件退出操作。

以待机插件device_standby_plugin为例,其代码实现路径为:device_standby_plugin.cpp

在init()函数中订阅相关事件,具体代码如下:

// 插件初始化
extern "C" bool OnPluginInit(std::string& libName)
{if (libName != LIB_NAME) {STANDBYSERVICE_LOGI("DeviceStandbyPlugin::OnPluginInit lib name is not match");return false;}DeviceStandbyPlugin::GetInstance().Init();STANDBYSERVICE_LOGI("DeviceStandbyPlugin::OnPluginInit success.");return true;
}void DeviceStandbyPlugin::Init()
{resTypes_.insert(RES_TYPE_APP_INSTALL_UNINSTALL);resTypes_.insert(RES_TYPE_SCREEN_STATUS);resTypes_.insert(RES_TYPE_TIME_CHANGED);resTypes_.insert(RES_TYPE_NITZ_TIME_CHANGED);resTypes_.insert(RES_TYPE_TIMEZONE_CHANGED);resTypes_.insert(RES_TYPE_NITZ_TIMEZONE_CHANGED);resTypes_.insert(RES_TYPE_CHARGING_DISCHARGING);resTypes_.insert(RES_TYPE_USB_DEVICE);resTypes_.insert(RES_TYPE_CALL_STATE_CHANGED);resTypes_.insert(RES_TYPE_WIFI_P2P_STATE_CHANGED);resTypes_.insert(RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED);resTypes_.insert(RES_TYPE_POWER_MODE_CHANGED);resTypes_.insert(RES_TYPE_CLICK_RECOGNIZE);resTypes_.insert(RES_TYPE_MMI_INPUT_POWER_KEY);for (auto resType : resTypes_) {PluginMgr::GetInstance().SubscribeResource(LIB_NAME, resType);}STANDBYSERVICE_LOGI("DevicesStandbyPlugin::Init success");
}

待机插件事件分发处理,相关代码如下:

// 获取分发的事件
extern "C" void OnDispatchResource(const std::shared_ptr<ResData>& data)
{DeviceStandbyPlugin::GetInstance().DispatchResource(data);STANDBYSERVICE_LOGD("DeviceStandbyPlugin::OnDispatchResource success.");
}

待机插件退出,相关代码如下:

// 插件退出
extern "C" void OnPluginDisable()
{DeviceStandbyPlugin::GetInstance().Disable();STANDBYSERVICE_LOGI("DeviceStandbyPlugin::OnPluginDisable success.");
}void DeviceStandbyPlugin::Disable()
{for (auto resType : resTypes_) {PluginMgr::GetInstance().UnSubscribeResource(LIB_NAME, resType);}resTypes_.clear();STANDBYSERVICE_LOGI("DevicesStandbyPlugin::Disable success");
}

在待机部件device_standby中使用事件

待机部件device_standby仓的源代码地址为:https://gitee.com/openharmony/resourceschedule_device_standby
设备待机部件为提高设备续航,降低设备功耗,在设备进入待机空闲状态时,系统会限制后台应用使用资源。开发者可以根据自身情况,为自己的应用申请纳入待机资源管控,或者暂时不被待机资源管控。
图 1 设备待机部件整体架构图
图 1 设备待机部件整体架构图
那么我们以亮屏和灭屏事件为例,看一下设备待机部件device_standby是如何使用资源调度部件resource_schedule_service中定义的事件的?

我们使用git clone https://gitee.com/openharmony/resourceschedule_device_standby.git命令下载好设备待机部件仓的源代码后,使用VScode打开源代码,搜索RES_TYPE_SCREEN_STATUS这个亮屏状态关键字,如下图所示:
搜索亮屏状态
可以看到utils\common\include\res_type.h中保持了一份资源调度模块的事件枚举
的子集,代码如下所示:

namespace OHOS {
namespace DevStandbyMgr {
namespace ResType {
enum : uint32_t {// first resTypeRES_TYPE_FIRST = 0,// screen status, value 0 means screen off, value 1 means screen on, else are invalid.RES_TYPE_SCREEN_STATUS = RES_TYPE_FIRST,// app state change event; value means app state; payload:pid,uid,bundleNameRES_TYPE_APP_STATE_CHANGE = 1,// ability state change event; value means ability state; payload:pid,uid,bundleNameRES_TYPE_ABILITY_STATE_CHANGE = 2,// extension state change event; value means extension state; payload:pid,uid,bundleNameRES_TYPE_EXTENSION_STATE_CHANGE = 3,// process state event; value 0:created, 1:died; payload:pid,uid,bundleNameRES_TYPE_PROCESS_STATE_CHANGE = 4,// window focused event; value 0:focused, 1:unfocused; payload:pid,uid,bundleName,windowId,windowType,displayIdRES_TYPE_WINDOW_FOCUS = 5,// transient task event; value 0:start, 1:finish; payload:pid,uid,bundleNameRES_TYPE_TRANSIENT_TASK = 6,// continuous task event; value 0:start, 1:finish; payload:pid,uid,abilityNameRES_TYPE_CONTINUOUS_TASK = 7,/* cgroup change event;* value 0:set thread group sched; 1:set thread sched* payload: pid,uid,name,oldGroup,newGroup*/RES_TYPE_CGROUP_ADJUSTER = 8,// ace gestures click_recognizer; value 1 touch event, value 2 click eventRES_TYPE_CLICK_RECOGNIZE = 9,// ace pipeline_context.cpp::PushPage(); value 0: push_page_start, 1: push_page_completeRES_TYPE_PUSH_PAGE = 10,// ace slide event recognize; value 1: list fling on; 0: list fling off; 3: slide normal begin, 4: slide normal end.RES_TYPE_SLIDE_RECOGNIZE = 11,// window visibility change, value 1: isVisible, 0: not isVisible, payload:pid,uid,windowId,windowTypeRES_TYPE_WINDOW_VISIBILITY_CHANGE = 12,// report mmi_service service; value mmi_service tid; payload:uid,pidRES_TYPE_REPORT_MMI_PROCESS = 13,// report render thread; value render tid; payload:uid,pidRES_TYPE_REPORT_RENDER_THREAD = 14,// app install and uninstall event; value 0: uninstall, 1: install; payload:uid,bundleNameRES_TYPE_APP_INSTALL_UNINSTALL = 15,// net connect state; value 0:unknow, 1:idle, 2:connecting, 3:connected, 4:disconnecting, 5:disconnectedRES_TYPE_WIFI_CONNECT_STATE_CHANGE = 16,// user switch, value means the userId which switch to.RES_TYPE_USER_SWITCH = 17,// user remove, value means the userId which is removed.RES_TYPE_USER_REMOVE = 18,// screen unlock, value 0 means unlock, value 1 means locked.RES_TYPE_SCREEN_LOCK = 19,// bluetooth a2dp connect state, value 1: connected, 3: disconnected.RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE = 20,// network latency request, value 0: low latency, 1: normal latency, payload: identityRES_TYPE_NETWORK_LATENCY_REQUEST = 21,// call state update; value 0 : active, value 1 : holding, value 2 : dialing, value 3 : alerting,// value 4 : incoming, value 5 : waiting, value 6 : disconnected, value 7 : disconnecting, value 8 : idleRES_TYPE_CALL_STATE_UPDATE = 22,// Other process modify the thread Qos, value for client name id, payload: tid : qos , clientpid, pidRES_TYPE_THREAD_QOS_CHANGE = 23,// audio render state change; value -1 : RENDERER_INVALID, value 0 : RENDERER_NEW, value 1 : RENDERER_PREPARED,// value 2 : RENDERER_RUNNING, value 3 : RENDERER_STOPPED, value 4 : RENDERER_RELEASED, value 5 : RENDERER_PAUSED// payload:uid,sessionIdRES_TYPE_AUDIO_RENDER_STATE_CHANGE = 24,// audio ring mode change; value 0 : RINGER_MODE_NORMAL, value 1 : RINGER_MODE_SILENT// value 2 : RINGER_MODE_VIBRATERES_TYPE_AUDIO_RING_MODE_CHANGE = 25,RES_TYPE_AUDIO_VOLUME_KEY_CHANGE = 26,// app_ability_start_event : a very early app startup stub, when the app process has not been pulled up.// stub position : ability_runtime ability_manager_service.cpp::StartAbilityInner().// specifically : ability type is PAGE and ability launchMode is not SPECIFIED.RES_TYPE_APP_ABILITY_START = 27,// ace pipeline_context.cpp::PopPage(); value means nothingRES_TYPE_POP_PAGE = 28,// ace web gesture event recognize; value means nothingRES_TYPE_WEB_GESTURE = 29,// info from msdp, means device still state change(enter or exit)RES_TYPE_DEVICE_STILL_STATE_CHANGE = 30,// window resize event; value 0: resize window , value 1: stop resizing window.RES_TYPE_RESIZE_WINDOW = 31,// window move event; value 0: move window, value 1: stop moving window.RES_TYPE_MOVE_WINDOW = 32,// animation transition event; value 0: animation begin, value 1: animation end.RES_TYPE_SHOW_REMOTE_ANIMATION = 33,// load page; value 0: load page begin, value 1: load page end.RES_TYPE_LOAD_PAGE = 34,// report camera state, value 0: camera connect; value 1: camera disconnectRES_TYPE_REPORT_CAMERA_STATE = 35,// value 2: runningLock is proxied; value 3: runningLock is not proxiedRES_TYPE_RUNNINGLOCK_STATE = 36,// drag status bar event; value 0: start drag, value 1: stop drag.RES_TYPE_DRAG_STATUS_BAR = 37,// report SceneBoard service, value pid; payload:uid, main_tid, bundleNameRES_TYPE_REPORT_SCENE_BOARD = 38,// report key thread for render, value 0 add key Thread, 1 remove key thread, payload: uid, pid, tid, roleRES_TYPE_REPORT_KEY_THREAD = 39,// report window state, value 0 add 1 remove, payload: uid, pid, windowId, serialNum state: 0 active 1 inactiveRES_TYPE_REPORT_WINDOW_STATE = 40,// report scene sched, value 0 scene on 1 scene off, payload: uid, sceneIdRES_TYPE_REPORT_SCENE_SCHED = 41,// web gesture move event; value 0: web gesture move start, value 1: web gesture move end.RES_TYPE_WEB_GESTURE_MOVE = 42,// web slide normal event; value 0: web slide normal start, value 1: web slide normal end.RES_TYPE_WEB_SLIDE_NORMAL = 43,// load url event; value means nothing.RES_TYPE_LOAD_URL = 44,// mousewheel event; value means nothing.RES_TYPE_MOUSEWHEEL = 45,// report webview audio status, value 0 start 1 stop, payload: uid, pid, tidRES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE = 46,// report entering the multimodalinput state, value means subscribed multimodalinput state.RES_TYPE_MMI_INPUT_STATE = 47,// report anco load protect file configRES_TYPE_ANCO_CUST = 48,// report anco app is frontRES_TYPE_ANCO_APP_FRONT = 49,// report time zone changedRES_TYPE_TIMEZONE_CHANGED = 50,// report connection statusRES_TYPE_CONNECTION_OBSERVER = 51,// report av session create eventRES_TYPE_AV_SESSION_ON_SESSION_CREATE = 52,// report av session release eventRES_TYPE_AV_SESSION_ON_SESSION_RELEASE = 53,// report av session change eventRES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE = 54,// report OnAppStateChanged eventRES_TYPE_ON_APP_STATE_CHANGED = 55,// report efficiency resources eventRES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED = 56,// report av_codec state, value 0:codec start info, value 1:codec stop info.RES_TYPE_AV_CODEC_STATE = 57,RES_TYPE_NITZ_TIME_CHANGED = 58,RES_TYPE_TIME_CHANGED = 59,RES_TYPE_NITZ_TIMEZONE_CHANGED = 60,RES_TYPE_CHARGING_DISCHARGING = 61,RES_TYPE_USB_DEVICE = 62,RES_TYPE_CALL_STATE_CHANGED = 63,RES_TYPE_WIFI_P2P_STATE_CHANGED = 64,// report power mode changedRES_TYPE_POWER_MODE_CHANGED = 92,// report power key downRES_TYPE_MMI_INPUT_POWER_KEY = 117,// last resTypeRES_TYPE_LAST,
};inline const std::map<uint32_t, std::string> resTypeToStr = {{ RES_TYPE_SCREEN_STATUS, "SCREEN_STATUS" },{ RES_TYPE_APP_STATE_CHANGE, "APP_STATE_CHANGE" },{ RES_TYPE_ABILITY_STATE_CHANGE, "ABILITY_STATE_CHANGE" },{ RES_TYPE_EXTENSION_STATE_CHANGE, "EXTENSION_STATE_CHANGE" },{ RES_TYPE_PROCESS_STATE_CHANGE, "PROCESS_STATE_CHANGE" },{ RES_TYPE_WINDOW_FOCUS, "WINDOW_FOCUS" },{ RES_TYPE_TRANSIENT_TASK, "TRANSIENT_TASK" },{ RES_TYPE_CONTINUOUS_TASK, "CONTINUOUS_TASK" },{ RES_TYPE_CGROUP_ADJUSTER, "CGROUP_ADJUSTER" },{ RES_TYPE_CLICK_RECOGNIZE, "CLICK_RECOGNIZE" },{ RES_TYPE_PUSH_PAGE, "PUSH_PAGE" },{ RES_TYPE_SLIDE_RECOGNIZE, "SLIDE_RECOGNIZE" },{ RES_TYPE_WINDOW_VISIBILITY_CHANGE, "WINDOW_VISIBILITY_CHANGE" },{ RES_TYPE_REPORT_MMI_PROCESS, "REPORT_MMI_PROCESS" },{ RES_TYPE_REPORT_RENDER_THREAD, "REPORT_RENDER_THREAD" },{ RES_TYPE_APP_INSTALL_UNINSTALL, "APP_INSTALL_UNINSTALL" },{ RES_TYPE_WIFI_CONNECT_STATE_CHANGE, "WIFI_CONNECT_STATE_CHANGE" },{ RES_TYPE_USER_SWITCH, "USER_SWITCH" },{ RES_TYPE_USER_REMOVE, "USER_REMOVE" },{ RES_TYPE_SCREEN_LOCK, "SCREEN_LOCK" },{ RES_TYPE_BLUETOOTH_A2DP_CONNECT_STATE_CHANGE, "BLUETOOTH_A2DP_CONNECT_STATE_CHANGE" },{ RES_TYPE_NETWORK_LATENCY_REQUEST, "NETWORK_LATENCY_REQUEST" },{ RES_TYPE_CALL_STATE_UPDATE, "CALL_STATE_UPDATE" },{ RES_TYPE_THREAD_QOS_CHANGE, "THREAD_QOS_CHANGE" },{ RES_TYPE_AUDIO_RENDER_STATE_CHANGE, "AUDIO_RENDER_STATE_CHANGE" },{ RES_TYPE_AUDIO_RING_MODE_CHANGE, "AUDIO_RING_MODE_CHANGE" },{ RES_TYPE_AUDIO_VOLUME_KEY_CHANGE, "AUDIO_VOLUME_KEY_CHANGE" },{ RES_TYPE_APP_ABILITY_START, "APP_ABILITY_START" },{ RES_TYPE_POP_PAGE, "POP_PAGE" },{ RES_TYPE_WEB_GESTURE, "WEB_GESTURE" },{ RES_TYPE_DEVICE_STILL_STATE_CHANGE, "DEVICE_STILL_STATE_CHANGE" },{ RES_TYPE_RESIZE_WINDOW, "RES_TYPE_RESIZE_WINDOW" },{ RES_TYPE_MOVE_WINDOW, "RES_TYPE_MOVE_WINDOW" },{ RES_TYPE_SHOW_REMOTE_ANIMATION, "RES_TYPE_SHOW_REMOTE_ANIMATION" },{ RES_TYPE_LOAD_PAGE, "RES_TYPE_LOAD_PAGE" },{ RES_TYPE_REPORT_CAMERA_STATE, "RES_TYPE_REPORT_CAMERA_STATE" },{ RES_TYPE_RUNNINGLOCK_STATE, "RES_TYPE_RUNNINGLOCK_STATE" },{ RES_TYPE_DRAG_STATUS_BAR, "RES_TYPE_DRAG_STATUS_BAR" },{ RES_TYPE_REPORT_SCENE_BOARD, "RES_TYPE_REPORT_SCENE_BOARD" },{ RES_TYPE_REPORT_KEY_THREAD, "RES_TYPE_REPORT_KEY_THREAD" },{ RES_TYPE_REPORT_WINDOW_STATE, "RES_TYPE_REPORT_WINDOW_STATE" },{ RES_TYPE_REPORT_SCENE_SCHED, "RES_TYPE_REPORT_SCENE_SCHED" },{ RES_TYPE_WEB_GESTURE_MOVE, "RES_TYPE_WEB_GESTURE_MOVE" },{ RES_TYPE_WEB_SLIDE_NORMAL, "RES_TYPE_WEB_SLIDE_NORMAL" },{ RES_TYPE_LOAD_URL, "RES_TYPE_LOAD_URL" },{ RES_TYPE_MOUSEWHEEL, "RES_TYPE_MOUSEWHEEL" },{ RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE, "RES_TYPE_WEBVIEW_AUDIO_STATUS_CHANGE" },{ RES_TYPE_MMI_INPUT_STATE, "RES_TYPE_MMI_INPUT_STATE" },{ RES_TYPE_ANCO_CUST, "RES_TYPE_ANCO_CUST" },{ RES_TYPE_ANCO_APP_FRONT, "RES_TYPE_ANCO_APP_FRONT" },{ RES_TYPE_TIMEZONE_CHANGED, "RES_TYPE_TIMEZONE_CHANGED" },{ RES_TYPE_TIME_CHANGED, "RES_TYPE_TIME_CHANGED" },{ RES_TYPE_NITZ_TIME_CHANGED, "RES_TYPE_NITZ_TIME_CHANGED" },{ RES_TYPE_NITZ_TIMEZONE_CHANGED, "RES_TYPE_NITZ_TIMEZONE_CHANGED" },{ RES_TYPE_CHARGING_DISCHARGING, "RES_TYPE_CHARGING_DISCHARGING" },{ RES_TYPE_USB_DEVICE, "RES_TYPE_USB_DEVICE" },{ RES_TYPE_CALL_STATE_CHANGED, "RES_TYPE_CALL_STATE_CHANGED" },{ RES_TYPE_WIFI_P2P_STATE_CHANGED, "RES_TYPE_WIFI_P2P_STATE_CHANGED" },{ RES_TYPE_CONNECTION_OBSERVER, "RES_TYPE_CONNECTION_OBSERVER" },{ RES_TYPE_AV_SESSION_ON_SESSION_CREATE, "RES_TYPE_AV_SESSION_ON_SESSION_CREATE" },{ RES_TYPE_AV_SESSION_ON_SESSION_RELEASE, "RES_TYPE_AV_SESSION_ON_SESSION_RELEASE" },{ RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE, "RES_TYPE_AV_SESSION_ON_TOP_SESSION_CHANGE" },{ RES_TYPE_ON_APP_STATE_CHANGED, "RES_TYPE_ON_APP_STATE_CHANGED" },{ RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED, "RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED" },{ RES_TYPE_AV_CODEC_STATE, "RES_TYPE_AV_CODEC_STATE" },{ RES_TYPE_POWER_MODE_CHANGED, "RES_TYPE_POWER_MODE_CHANGED" },
};
} // namespace ResType
} // namespace ResourceSchedule
} // namespace OHOS

并且在services\core\src\standby_service_impl.cpp中的 StandbyServiceImpl::HandleCommonEvent接口,实现了对事件的统一处理,代码如下:

ErrCode StandbyServiceImpl::HandleCommonEvent(const uint32_t resType, const int64_t value, const std::string &sceneInfo)
{STANDBYSERVICE_LOGI("HandleCommonEvent resType = %{public}u, value = %{public}lld, sceneInfo = %{public}s",resType, (long long)(value), sceneInfo.c_str());switch (resType) {case ResType::RES_TYPE_SCREEN_STATUS:HandleScreenStateChanged(value);break;case ResType::RES_TYPE_CHARGING_DISCHARGING:HandleChargeStateChanged(value);break;case ResType::RES_TYPE_USB_DEVICE:if (value == 0) {DispatchEvent(StandbyMessage(StandbyMessageType::COMMON_EVENT,EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED));} else {DispatchEvent(StandbyMessage(StandbyMessageType::COMMON_EVENT,EventFwk::CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED));}break;case ResType::RES_TYPE_CALL_STATE_CHANGED:HandleCallStateChanged(sceneInfo);break;case ResType::RES_TYPE_WIFI_P2P_STATE_CHANGED:HandleP2PStateChanged(value);break;case ResType::RES_TYPE_CLICK_RECOGNIZE:HandleScreenClickRecognize(value);break;case ResType::RES_TYPE_MMI_INPUT_POWER_KEY:HandleMmiInputPowerKeyDown(value);break;
#ifdef STANDBY_POWER_MANAGER_ENABLEcase ResType::RES_TYPE_POWER_MODE_CHANGED:HandlePowerModeChanged(static_cast<PowerMgr::PowerMode>(value));break;
#endifcase ResType::RES_TYPE_EFFICIENCY_RESOURCES_STATE_CHANGED:HandleResourcesStateChanged(value, sceneInfo);break;default:AppEventHandler(resType, value, sceneInfo);break;}return ERR_OK;
}void StandbyServiceImpl::HandleScreenStateChanged(const int64_t value)
{if (value == 1) {DispatchEvent(StandbyMessage(StandbyMessageType::COMMON_EVENT,EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON));} else {DispatchEvent(StandbyMessage(StandbyMessageType::COMMON_EVENT,EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF));}
}

相关文章:

OpenHarmony的公共事件

OpenHarmony的公共事件 公共事件简介 CES&#xff08;Common Event Service&#xff0c;公共事件服务&#xff09;为应用程序提供订阅、发布、退订公共事件的能力。 公共事件分类 公共事件从系统角度可分为&#xff1a;系统公共事件和自定义公共事件。 系统公共事件&#…...

深度学习transformer

Transformer可是深度学习领域的一个大热门呢&#xff01;它是一个基于自注意力的序列到序列模型&#xff0c;最初由Vaswani等人在2017年提出&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;领域的任务&#xff0c;比如机器翻译、文本生成这些。它厉害的地方在…...

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…...

【黑马点评debug日记】redis登录跳转不成功

登录后一直跳转登录界面&#xff1b; debug: 网络日志报401&#xff0c; 说明前端获取的token为空&#xff1b; 查看应用程序&#xff0c; 发现没有token存储信息 前端网页增加 sessionStorage.setItem("token", data); 记得刷新网页 成功存储token...

C#自定义特性-SQL

语法 原则 自定义特性必须继承自System.Attribute类&#xff1b; AttributeUsage属性来指定特性的使用范围和是否允许重复等&#xff1b; 在特性类中定义属性&#xff0c;这些属性将用于存储特性值。 示例 using System;// 定义一个自定义特性类 [Attribute…...

协方差矩阵及其计算方法

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个描述多维数据特征之间相互关系的矩阵&#xff0c;广泛应用于统计学和机器学习中。它用于表示各个特征之间的协方差&#xff0c;是分析多维数据分布和特征依赖性的重要工具。 什么是协方差矩阵&#xff1f; 协方差矩…...

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别&#xff0c;可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网&#xff1a; ​安装 WSL 前提 以下基于windows 111专业版进行配置&#xff0c;windows 10应该也是可以…...

Visual Studio Code 端口转发功能详解

Visual Studio Code 端口转发功能详解 引言 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一个功能强大的源代码编辑器&#xff0c;它支持多种编程语言的语法高亮、智能代码补全、自定义快捷键、代码重构等特性。除了这些基本功能外&#xff0c;VS Code 还提供了…...

Android Framework AMS(14)ContentProvider分析-1(CP组件应用及开机启动注册流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读ContentProvider组件的基本知识。关注思维导图中左上侧部分即可。 有了前面activity组件分析、service组件分析、广播组件分析的基…...

Three.js PBR材质

本文将详细介绍Three.js中的PBR&#xff08;Physically Based Rendering&#xff09;材质&#xff0c;包括PBR的基本概念、适用场景、PBR材质的构建以及一些高级应用技巧。 1. PBR&#xff08;Physically Based Rendering&#xff09;基本概念 PBR&#xff0c;即Physically B…...

智谱AI清影升级:引领AI视频进入音效新时代

前几天智谱推出了新清影,该版本支持4k、60帧超高清画质、任意尺寸&#xff0c;并且自带音效的10秒视频,让ai生视频告别了"哑巴时代"。 智谱AI视频腾空出世&#xff0c;可灵遭遇强劲挑战&#xff01;究竟谁是行业翘楚&#xff1f;(附测评案例)之前智谱出世那时体验了一…...

嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)

引言&#xff1a;在我们的日常使用中&#xff0c;MOS就是个纯粹的电子开关&#xff0c;虽然MOS管也有放大作用&#xff0c;但是几乎用不到&#xff0c;只用它的开关作用&#xff0c;一般的电机驱动&#xff0c;开关电源&#xff0c;逆变器等大功率设备&#xff0c;全部使用MOS管…...

Centos 9 安装 PostgreSQL 16 并支持远程访问

仅列出核心操作&#xff0c;可以解决使用过程中遇到的访问问题。 1 安装 使用dnf源安装 sudo dnf module -y install postgresql:16 2 配置文件夹权限 使用root权限操作 sudo chown postgres:postgres /var/lib/pgsql/datasudo chmod -R 0750 /var/lib/pgsql/data 3 初…...

Dubbo源码解析(三)

一、Dubbo整合Spring启动流程 Dubbo的使用可以不依赖Spring&#xff0c;但是生产环境中Dubbo都是整合到Spring中一起使用&#xff0c;所以本章就解析Dubbo整合Spring的启动流程 一、传统的xml解析方式 一、Dubbo配置解析流程 在Java 中&#xff0c;一切皆对象。在JDK 中使用…...

HarmonyOS Next星河版笔记--界面开发(5)

1.字符串 1.1.字符串拼接 作用&#xff1a;把两个或多个字符串&#xff0c;拼成一个字符串。&#xff08;通常是用来拼接字符串和变量&#xff09; hello world > helloworld 加好作用&#xff1a;拼接 let name:string 小明 console.log(简介信息,名字是 name) …...

Spring Boot3 实战案例合集上线了

Spring Boot3实战案例合集...

在Ubuntu 24.04 LTS上安装飞桨PaddleX

前面我们介绍了《在Windows用远程桌面访问Ubuntu 24.04.1 LTS》本文接着介绍安装飞桨PaddleX。 PaddleX 3.0 是基于飞桨框架构建的一站式全流程开发工具&#xff0c;它集成了众多开箱即用的预训练模型&#xff0c;可以实现模型从训练到推理的全流程开发&#xff0c;支持国内外多…...

Homebrew 命令大全

Homebrew 是 macOS 和 Linux 系统上的一个流行的包管理器&#xff0c;它可以帮助用户轻松地安装、更新和管理软件包。以下是一些常用的 Homebrew 命令&#xff1a; 安装 Homebrew 如果你还没有安装 Homebrew&#xff0c;可以使用以下命令在 macOS 上进行安装&#xff1a; /b…...

Docker+Django项目部署-从Linux+Windows实战

一、概述 1. 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;支持在win、mac、Linux系统上进行安装。可以帮助我们在一台电脑上创建出多个隔离的环境&#xff0c;比传统的虚拟机极大的节省资源 。 为什么要创建隔离的环境&#xff1f; 假设你先在有一个centos7.…...

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…...

11.15 机器学习-集成学习方法-随机森林

# 机器学习中有一种大类叫**集成学习**&#xff08;Ensemble Learning&#xff09;&#xff0c;集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话&#xff1a; # 三个臭皮匠&#xff0c…...

【SQL】E-R模型(实体-联系模型)

目录 一、介绍 1、实体集 定义和性质 属性 E-R图表示 2. 联系集 定义和性质 属性 E-R图表示 一、介绍 实体-联系数据模型&#xff08;E-R数据模型&#xff09;被开发来方便数据库的设计&#xff0c;它是通过允许定义代表数据库全局逻辑结构的企业模式&#xf…...

C/C++静态库引用过程中出现符号未定义的处理方式

问题背景&#xff1a; 在接入新库&#xff08;静态库&#xff09;时遇到了符号未定义问题&#xff0c;并发现改变静态库的链接顺序可以解决问题。 问题根源&#xff1a; 静态库是由 .o 文件拼接而成的&#xff0c;链接静态库时&#xff0c;链接器以 .o 文件为单位进行处理。链接…...

『VUE』27. 透传属性与inheritAttrs(详细图文注释)

目录 什么是透传属性&#xff08;Forwarding Attributes&#xff09;使用条件唯一根节点禁用透传属性继承总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 什么是透传属性&#xff08;Forwarding Attributes&#xff09; 在 V…...

借助Excel实现Word表格快速排序

实例需求&#xff1a;Word中的表格如下图所示&#xff0c;为了强化记忆&#xff0c;希望能够将表格内容随机排序&#xff0c;表格第一列仍然按照顺序编号&#xff0c;即编号不跟随表格行内容调整。 乱序之后的效果如下图所示&#xff08;每次运行代码的结果都不一定相同&#x…...

数据结构 ——— 层序遍历链式二叉树

目录 链式二叉树示意图​编辑 何为层序遍历 手搓一个链式二叉树 实现层序遍历链式二叉树 链式二叉树示意图 何为层序遍历 和前中后序遍历不同&#xff0c;前中后序遍历链式二叉树需要利用递归才能遍历 而层序遍历是非递归的形式&#xff0c;如上图&#xff1a;层序遍历的…...

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…...

SpringBoot整合Mybatis-Plus实践汇总

相关依赖 MyBatis-Plus涉及的依赖主要是Mybatis-start、和分页插件的依赖&#xff0c;不考虑使用额外分页插件的前提下&#xff0c;只需要mybatis-plus-boot-starter一个依赖即可与SpringBoot集成&#xff1a; <!--Mybatis-plugs--><dependency><groupId>co…...

基于Spring Boot的在线性格测试系统设计与实现(源码+定制+开发)智能性格测试与用户个性分析平台、在线心理测评系统的开发、性格测试与个性数据管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Python实现人脸识别算法并封装为类库

引言 人脸识别技术在现代社会中应用广泛&#xff0c;从安全监控到智能门锁&#xff0c;再到社交媒体中的照片标记功能&#xff0c;都离不开这项技术。本文将详细介绍如何使用Python实现基本的人脸识别算法&#xff0c;并将其封装为一个类库&#xff0c;以便在多个项目中复用。…...