5、Car App Library入门:什么是Car App Library、核心组件介绍、依赖配置、第一个Car App示例。
好,咱们今天聊聊Car App Library。说实话,这个库是我在车载开发中用得最多的东西。你想想看,Android Automotive OS虽然是个完整的系统,但车机屏幕和手机屏幕差别太大了——旋钮操作、方向盘按键、大屏分屏,这些场景手机应用根本不会遇到。Car App Library就是Google专门为这些场景准备的开发工具包。
什么是Car App Library
Car App Library,简称CAL,是一套Android Jetpack的扩展库。它的目标很明确:让开发者能用标准Android组件,构建出符合车机交互规范的应用。
我刚开始接触车载开发时,以为直接写个普通Android应用就能跑。结果一上车机,按钮太小点不到,列表滚动不流畅,分屏模式下布局全乱套。嗯,这就是没有用CAL的后果。
CAL主要解决了三个问题:
- 交互适配:把触摸操作自动映射成旋钮、方向盘按键操作
- UI规范:提供符合车机设计规范的组件,比如大按钮、高对比度文字
- 分屏支持:自动适配不同屏幕尺寸和分屏模式
核心要点:Car App Library不是替代Android SDK,而是在其之上做了一层车机适配。你的业务逻辑还是用标准Android写法,只是UI层换成CAL组件。
核心组件介绍
CAL的组件体系,说白了就是一套专门为车机定制的UI工具箱。我挑几个最常用的给你讲讲。
CarAppService
这是所有CAL应用的入口。它不像普通Activity那样直接启动界面,而是通过Service的方式运行。车机系统会通过绑定Service来获取你的应用内容。
class MyCarAppService : CarAppService() {
override fun onCreateSession(): Session {
return MySession()
}
}
class MySession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
return MyScreen()
}
}
我在项目中遇到过一个问题:忘记在AndroidManifest.xml里声明这个Service。结果应用装上去,车机根本识别不到。你记得加上这个:
<service
android:name=".MyCarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
</intent-filter>
</service>
Screen
Screen对应普通Android里的Activity或Fragment。但它更轻量,生命周期也更简单。每个Screen负责一个页面内容。
CarText、CarIcon、ActionStrip
这些是CAL的基础UI组件。CarText会自动调整字号和对比度,CarIcon会适配车机主题,ActionStrip则是操作栏——你想想看,车机上没有返回键,全靠ActionStrip提供导航。
ListTemplate、GridTemplate、PaneTemplate
这是CAL提供的三种布局模板:
| 模板 | 适用场景 | 我常用的地方 |
|---|---|---|
| ListTemplate | 列表型内容,如联系人、设置项 | 音乐播放列表、电话通讯录 |
| GridTemplate | 网格型内容,如应用图标、快捷操作 | 主界面快捷卡片、媒体分类 |
| PaneTemplate | 分栏布局,左侧导航右侧内容 | 设置页面、多级菜单 |
我的建议:刚开始学CAL,先死磕ListTemplate。它最常用,也最容易上手。我带的几个新人,都是从ListTemplate开始,一周内就能写出可用的车机应用。
依赖配置
配置依赖其实很简单。在build.gradle里加上一行就行。但有个坑——版本号要跟你的AndroidX版本匹配。
dependencies {
implementation "androidx.car.app:app:1.3.0"
}
我曾经因为版本号写错,编译过了但运行时崩溃。查了半天,发现是1.2.0和1.3.0的API有差异。建议你直接用最新稳定版,去Google的Release Notes里查。
另外,别忘了在AndroidManifest里声明车机功能:
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
这行代码告诉系统:我这个应用只能在车机上运行。如果你不加,应用可能在手机上也能安装,但跑起来会出各种奇怪问题。
第一个Car App示例
好,咱们动手写一个最简单的CAL应用。就一个页面,显示"Hello, Automotive OS"。
先创建CarAppService:
class HelloCarService : CarAppService() {
override fun onCreateSession(): Session {
return HelloSession()
}
}
class HelloSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
return HelloScreen()
}
}
再创建Screen,用ListTemplate展示内容:
class HelloScreen : Screen() {
override fun onGetTemplate(): Template {
val listBuilder = ListTemplate.Builder()
val row = Row.Builder()
.setTitle("Hello, Automotive OS")
.addText("这是我的第一个Car App")
.build()
listBuilder.addRow(row)
return listBuilder.build()
}
}
最后别忘了在AndroidManifest里注册Service和声明车机特性。编译安装后,车机应用列表里就会出现你的应用。
注意:CAL应用不能在普通手机上调试。你需要用Android Automotive模拟器,或者直接跑在车机上。我刚开始不知道,在手机上折腾了半天,结果应用根本启动不了。
这里我画了一张CAL的核心架构图,帮你理清各个组件的关系:
这张图展示了CAL应用从启动到界面渲染的完整流程。你仔细看,每个层级只负责一件事:CarAppService负责注册,Session负责管理,Screen负责内容,Template负责布局。这种分层设计,说白了就是为了让代码更清晰、更容易维护。
好了,这就是CAL的入门内容。你把这个示例跑起来,就算正式踏入车载开发的大门了。后面我们会深入每个组件的细节,到时候再聊。
公众号:蓝海资料掘金营,微信deep3321