📚往期笔录记录✏️:
✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
✏️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
✏️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
✏️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
✏️ 记录一场鸿蒙开发岗位面试经历~
✏️ 持续更新中……
前言
上一篇介绍了鸿蒙业务模型中的三大概念以及简单的注册过程,相信读者已经对鸿蒙的业务逻辑有了一定的了解。简单的来说,就是将多个子功能注册到服务中,再把服务注册到全局系统功能管理器(Samgr)中。这样,一个服务包含零个或多个功能,而功能又绑定了对外接口,然后我们可以向暴露的接口发送消息,等服务执行特定的处理后再将响应消息发送回来。这是最简单最直观的一次交互过程,但是要完成这样的交互,鸿蒙的底层还需要做许多基础工作,比如服务的初始化、功能的初始化、消息传输对象的构建等等。所以,在本文中我将会为读者介绍一次简单的交互过程中所涉及的数据结构及通信过程,以帮助读者更好的理解鸿蒙的业务模型,起到抛砖引玉的作用。
进程内通信详解
上一篇文章已经介绍了Service、Feature和IUnknown以及它们的实例对象ServiceImpl、FeatureImpl和SamgrLiteImpl。在这部分将会对消息通信过程中重要的结构体进行分析,掌握这些重要结构就可以理解鸿蒙的通信机制和交互过程。
Vector
Vector说是鸿蒙系统中最重要的结构也不为过,它是鸿蒙开发的一种简化版的容器,适用于数据量较小且需要动态扩展的C语言开发场景。它的底层实现是封装了一块数据缓冲区,使用max、top和free三个字段来维护缓冲区中的数据。并定义了两个函数指针成员,一个用于获取vector中数据的键值,另一个用于比较键值,由调用者在创建vector时指定。它的结构定义如下:
typedef struct SimpleVector {
int16 max; //可存储的最大数据记录数,即vector的容量。
int16 top; //已使用的数据记录数。
int16 free; //已释放的数据记录数。
void **data; //数据缓冲区,指向一块内存空间
//函数指针,指向将数据元素转换为键值的函数
VECTOR_Key key;
/**
* 函数指针,指向比较调用者提供的两个键值的函数
* 1 表示key1大于key2
* 0 表示key1等于key2
* -1 表示key1小于key2
*/
VECTOR_Compare compare;
} Vector;
Vector部分更详细的数据和函数分析 看这里 。
消息队列
消息队列在linux系统中常用来辅助消息的传输,可以用作进程间通信,也可