简介:Hvac(Heating Ventilation and Air Conditioning),意为供暖、通风和空气调节,本篇文章主要介绍:(1)车机Hvac 的UI介绍(2)车机Hvac的设计架构
1、车机Hvac的UI介绍
图1
点击导航栏风扇图标,出现图1所示界面,即Hvac的控制面板,这个控制面板不是Activity或Fragment,而是一个Window,这个Window是由一个Service调出和管理的,即下文HvacUiService,因为Window的优先级更高,控制面板调出时要能显示在最上面。下面对面板上各个图标表达的含义说明如下:
1)主驾空调温度调节2)副驾空调温度(温度默认华氏度,可设置摄氏度)3)空气内或外循环开关4)风速调节5)制冷开关6)风向调节,从左到右依次是:吹脸、吹脸和脚、吹脚、吹脚和挡风玻璃7)空调电源开关8)主驾座椅加热9)前挡风玻璃除雾10)自动模式11)后挡风玻璃除雾12)副驾座椅加热
这里要做一个说明:Android12源码目录下有2个地方存在Hvac,一个是/packages/apps/Car/SystemUI目录下,一个是/packages/apps/Car目录下单独的Hvac,图1中调出来的是SystemUI目录下的Hvac,但实际开发一般用/packages/apps/Car目录下单独的Hvac,因为图1面板是SystemUI通过发送广播从而跨进程调出的,打开图2HvacUiService.java,其中的onCreate方法下的源码如下
IntentFilter filter = new IntentFilter(); filter.addAction(CAR_INTENT_ACTION_TOGGLE_HVAC_CONTROLS); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); // Register receiver such that any user with climate control permission can call it. registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, Car.PERMISSION_CONTROL_CAR_CLIMATE, null);
可见,其注册了一个接收Action为CAR_INTENT_ACTION_TOGGLE_HVAC_CONTROLS的广播,通过发送这个广播,可以调出/packages/apps/Car目录下单独的Hvac。
2、车机Hvac的设计架构
图2
如图2所示,是车机Hvac的源码目录。整个源码使用的是MVC的设计架构,MVC设计架构比较宽泛,没有特别明确的架构图,但必须包含View、Model、Controller三要素,View对应ui目录下的类,Model数据层对应DataStore,Controller层对应controllers目录下的类。
下面先简要梳理整个车载Hvac的UML关键时序图,从而对整个Hvac控制面板的启动和初始化流程有所把握,如图3所示
图3
图3涉及到的类说明如下:
1)BootCompleteReceiver:开机广播接收器,接收到开机广播后负责拉起HvacUiService服务
2)HvacUiService:该服务用来管理Hvac控制面板Window,主要就是绘制和初始化
3)HvacController:这个是一个服务,封装了HvacManager这个核心车载空调管理接口,除此之外,这个服务还封装了控制面板的所有动画
4)Car:车辆的底层顶级接口,通过此接口可获取其它车辆子接口,包括CarHvacManager
5)HvacPanelController:空调面板控制器,其绑定了HvacController
下面以风速调节面板UI子模块来阐述该项目中的MVC设计理念,其它UI模块可类比,如图4所示
图4
风向调节面板UI模块的UML类图如下图5所示
图5
结尾:本篇文章主要介绍了车载空调面板的UI构成及图标含义,解析了车载空调面板启动和初始化的UML时序图,基于风向调节UI子模块为例,展示了MVC架构的具体实现,构建了MVC对应的UML类图,其它车载空调面板子模块可类比此文进行理解,大同小异。