第4章:车载服务层(Car Service)——CarService架构、核心API、服务注册与发现
好,咱们进入车载系统的核心地带了。
CarService,说白了就是车载Android系统的“大脑中枢”。你想想看,车上的硬件那么多——空调、车窗、方向盘、传感器……每个都直接跟系统打交道?那不乱套了。CarService就是那个统一调度、统一管理的角色。
4.1 CarService的整体架构
我习惯把CarService理解成一个“服务大管家”。它运行在系统进程中,负责管理所有车载相关的硬件服务。
它的架构大致分三层:
- 底层:通过HAL(硬件抽象层)与硬件通信。比如空调的冷暖风、车窗的升降电机,都通过HAL接口控制。
- 中间层:CarService本身。它封装了各种Manager(如CarClimateManager、CarWindowManager),对外提供统一的API。
- 上层:应用层。车载应用通过bindService的方式绑定到CarService,然后调用Manager接口。
嗯,这里要注意一点:CarService是单例的,整个系统只有一个实例。我在项目中遇到过有人试图多次启动CarService,结果导致服务冲突,系统直接崩溃。所以,千万别这么干。
4.2 核心API:CarManager体系
CarService暴露给应用层的核心,就是CarManager。它其实是一个抽象类,具体实现由各个子Manager完成。
常用的Manager有这些:
| Manager名称 | 功能说明 |
|---|---|
| CarClimateManager | 控制空调温度、风量、风向等 |
| CarWindowManager | 控制车窗升降、天窗开关 |
| CarSensorManager | 获取车速、油耗、胎压等传感器数据 |
| CarAudioManager | 管理车载音频焦点、音量、音区 |
| CarHvacManager | 暖通空调系统控制(部分车型独立) |
举个例子,你想让应用控制空调温度,代码大概是这样:
// 绑定CarService
Car car = Car.createCar(context);
car.connect();
// 获取空调Manager
CarClimateManager climateManager = (CarClimateManager) car.getCarManager(Car.CLIMATE_SERVICE);
// 设置温度25度
climateManager.setTemperature(CarClimateManager.ZONE_DRIVER, 25.0f);
我个人习惯在onCreate里就绑定CarService,但要注意异步回调。我曾经踩过一个坑:在绑定完成前就调用Manager方法,结果返回null。所以一定要在onServiceConnected回调里操作。
4.3 服务注册与发现机制
CarService怎么知道有哪些服务可用?这就涉及到服务注册与发现了。
其实原理很简单:每个车载硬件服务在启动时,会向CarService注册自己。CarService维护一个服务列表,应用通过Manager名称来查找对应的服务。
注册流程大致如下:
- 硬件服务(如ClimateService)继承自CarServiceBase。
- 在系统启动时,CarService读取配置文件(通常是car_config.xml),知道要加载哪些服务。
- CarService通过反射或直接实例化,创建这些服务对象。
- 服务对象调用registerService()方法,把自己注册到CarService的服务注册表中。
服务发现就更直接了:应用调用car.getCarManager(Car.CLIMATE_SERVICE)时,CarService根据传入的字符串,从注册表里找到对应的Binder对象,返回给应用。
核心要点:服务注册表本质是一个Map<String, IBinder>。Key是服务名称,Value是Binder代理。所以服务名称必须唯一,不能重复。
4.4 避坑指南:服务注册的常见问题
我曾经遇到过一个问题:自定义服务注册后,应用一直找不到。排查了半天,发现是服务名称写错了大小写。CarService的服务名称是大小写敏感的,比如"climate"和"Climate"是两个不同的服务。
另外,服务注册的顺序也有讲究。我建议把核心服务(如电源管理、传感器)放在前面注册,次要服务(如氛围灯、座椅按摩)放在后面。因为CarService启动时是顺序加载的,如果某个服务注册失败,会影响后续服务的加载。
小技巧:你可以在car_config.xml里配置服务的启动级别。比如:
<service name="climate" class="com.android.car.climate.ClimateService" level="critical"/>
<service name="ambient_light" class="com.android.car.light.AmbientLightService" level="normal"/>
critical级别的服务如果启动失败,CarService会直接报错退出。normal级别的服务失败,只会打印警告,不影响其他服务。
4.5 总结一下
CarService的架构其实不复杂,但细节很多。你只要记住三点:
- CarService是单例的服务大管家,管理所有车载硬件。
- 应用通过CarManager体系与硬件交互,不要直接操作Binder。
- 服务注册与发现基于Map实现,名称唯一、大小写敏感。
嗯,这一章就到这里。下一章咱们聊聊车载电源管理,那可是个容易出bug的地方。