Ability子系统之数据观察者服务-dataobsmgr 原创

九重霄99
发布于 2022-3-2 14:23
浏览
2收藏

作者:纪春祥

概述

dataobsmgr全称为(data observer manager service)数据观察者管理业务。在操作系统中有些数据的变更,需要通知到其他模块,需要对相应数据和接口进行登记(源应用负责注册)、绑定(在数据发生变更的时候调用目标接口)。

HarmonyOS官网例子:

@Override
public void onStart(Intent intent) {
    // ...
    dataAbilityHelper = DataAbilityHelper.creator(this);
    IDataAbilityObserver dataAbilityObserver = new IDataAbilityObserver() {
        @Override    
        public void onChange() {
            String timeFormat = SystemSettings.getValue(dataAbilityHelper, SystemSettings.Date.TIME_FORMAT);
            setTimeFormat(timeFormat);
        }
    };
    dataAbilityHelper.registerObserver(SystemSettings.getUri(SystemSettings.Date.TIME_FORMAT), dataAbilityObserver);
}

void setTimeFormat(String timeFormat) {
    String timeStr = "12";
    if (timeStr.equals(timeFormat)) {        
        // Display in 12-hour format
    } else {
        // Display in 24-hour format
    }
}

代码结构

Ability子系统之数据观察者服务-dataobsmgr-鸿蒙开发者社区

Ability子系统之数据观察者服务-dataobsmgr-鸿蒙开发者社区

Proxy 是IPC客户端,Stub 是IPC服务端,Service 是服务端对象,Inner 是 Service 的内部逻辑。
IPC(Inter-Process Communication,进程间通信),之所以在dataobsmgr引入IPC,因为OpenHarmony是一个分布式系统,数据分布式、应用部署也是分布式。

基本流程时序图

Ability子系统之数据观察者服务-dataobsmgr-鸿蒙开发者社区

1、DataObsMgrService作为系统服务,由OpenHarmony操作系统调用OnStart()和OnStop()完成启动和停止;
2、应用通过调用DataObjManagerStub的OnRemoteRequest方法完成DataObsManager的注册、注销和消息响应;
3、分别触发DataObsMgrInner的注册、注销和消息;
4、消息会触发IDataAbilityObserver的OnChange函数,即应用侧需要实现的函数。

int* DataObsMgrInner::HandleNotifyChange(*const* Uri *&**uri*)
{
  HILOG_INFO("DataObsMgrInner::HandleNotifyChange called start");
  std::lock_guard<std::mutex> *lock_l*(**innerMutex_**);
  ObsListType *obslist*;
  if (!GetObsListFromMap(*uri*, *obslist*)) {
    AtomicSubTaskCount();
    HILOG_INFO("DataObsMgrInner::HandleNotifyChange there is no obs in the uri.");
    return NO_OBS_FOR_URI;
  }

  for (*auto* *obs* : *obslist*) {
    if (*obs* != nullptr) {
      *obs*->OnChange();
    }
  }

  AtomicSubTaskCount();
  HILOG_INFO("DataObsMgrInner::HandleNotifyChange called end %{public}zu", *obslist*.size());
  return NO_ERROR;
}

遗留:
1、OnRemoteRequest如何被触发的?
2、客户端和服务端分别是如何触发的?
需要参见IPC相关机制,这里不做深究。

更多原创内容请关注:深开鸿技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2022-3-4 16:55:09修改
1
收藏 2
回复
举报
回复
    相关推荐