14、车载设置应用:Settings应用架构;车载设置项定制(Wi-Fi、蓝牙、显示、声音);多用户设置管理;工厂模式设置。
好,咱们今天聊一个非常“接地气”的话题——车载设置应用。你想想看,用户每天上车,最常碰到的就是设置界面。调个音量、连个蓝牙、改个显示亮度……这些看似简单的操作,背后其实藏着一整套架构设计。
我个人习惯把车载设置应用比作“车机的控制面板”。它不像地图或音乐那样花哨,但它的稳定性直接影响用户体验。我在项目中遇到过好几次,因为设置项没处理好,导致用户连不上蓝牙,最后投诉到车厂。嗯,这活儿真不能马虎。
14.1 Settings应用架构
Android Automotive的Settings应用,本质上是一个“多面板”的Activity。它不像手机Settings那样有复杂的Fragment嵌套,而是更偏向于“列表+详情”的模式。
核心架构分为三层:
- UI层:负责展示设置项列表和详情页。通常使用RecyclerView + PreferenceFragmentCompat。
- 业务逻辑层:处理设置项的读写、状态同步。比如Wi-Fi开关状态、蓝牙配对列表。
- 数据层:通过ContentProvider或系统Service访问底层硬件状态。比如Settings.Global、WifiManager、BluetoothAdapter。
我建议你重点关注SettingsFragment的加载机制。它通过一个XML配置文件(比如settings_main.xml)来定义哪些设置项显示在首页。这个文件里每个<PreferenceScreen>对应一个子页面。
核心要点:车载Settings的首页列表,不是写死的。它通过SettingsActivity中的onBuildHeaders()方法动态加载。你可以根据车型、配置、甚至用户角色来动态增删设置项。
为什么会这样设计?说白了,是为了解耦。车厂经常要定制设置项,如果写死在代码里,每次改都要发版。用配置文件,OTA一下就能搞定。
14.2 车载设置项定制
定制设置项,是咱们开发中最常碰到的需求。车厂老板说:“我要加一个‘氛围灯颜色’的设置项。” 好,那咱们就得动手了。
14.2.1 Wi-Fi设置定制
Wi-Fi设置,说白了就是管理无线网络连接。但车载Wi-Fi有个特殊点:它不仅要连热点,还要支持Wi-Fi Direct(用于车机互联)。
定制Wi-Fi设置项,通常需要做这几件事:
- 在
settings_main.xml中添加Wi-Fi的入口。 - 创建
WifiSettingsFragment,继承PreferenceFragmentCompat。 - 使用
WifiManager扫描和连接网络。
我曾经踩过一个坑:车载Wi-Fi在休眠后会自动断开。原因是系统电源管理把Wi-Fi芯片给关了。解决办法是在WifiSettingsFragment的onResume()中重新注册扫描回调,并设置WifiManager.WIFI_MODE_FULL_HIGH_PERF。
注意:车载Wi-Fi的扫描间隔不要设得太短。我见过有些开发设成1秒扫一次,结果Wi-Fi芯片发热严重。建议至少3秒以上。
14.2.2 蓝牙设置定制
蓝牙设置,比Wi-Fi复杂一些。因为它涉及配对、连接、音频路由等多个环节。
定制蓝牙设置项,核心是管理BluetoothDevice列表。我建议你使用BluetoothAdapter的getBondedDevices()来获取已配对设备,然后用BluetoothHeadset或BluetoothA2dp来管理连接状态。
嗯,这里有个小技巧:在车载蓝牙设置中,最好显示设备的“信号强度”和“上次连接时间”。用户看到这些信息,就知道该连哪个设备了。
个人经验:我在做蓝牙设置时,发现有些手机配对后会自动断开。后来查了日志,发现是BluetoothAdapter的ACTION_ACL_DISCONNECTED广播没处理好。记得在Fragment中注册这个广播,并更新UI状态。
14.2.3 显示设置定制
显示设置,包括亮度、字体大小、深色模式等。车载显示有个特点:屏幕大,而且经常在强光下使用。
定制显示设置项,我建议你重点关注:
- 亮度调节:使用
Settings.System.SCREEN_BRIGHTNESS,但要注意车载的亮度范围可能比手机宽(0-255,但有些车机支持0-511)。 - 深色模式:通过
UiModeManager的setNightMode()来切换。但要注意,车载系统可能已经根据大灯状态自动切换了。 - 字体大小:使用
Settings.System.FONT_SCALE。但别改得太夸张,我见过有人设成1.5倍,结果界面都挤爆了。
避坑指南:我曾经在显示设置中直接修改Settings.System的值,结果发现重启后不生效。后来才知道,车载系统有overlay机制,需要同时更新Settings.System和Settings.Global中的对应项。
14.2.4 声音设置定制
声音设置,是用户最敏感的。音量调大了刺耳,调小了听不清。
定制声音设置项,核心是管理AudioManager的各个流类型:
| 流类型 | 用途 | 建议范围 |
|---|---|---|
| STREAM_MUSIC | 音乐、视频 | 0-15 |
| STREAM_VOICE_CALL | 通话 | 0-7 |
| STREAM_NAVIGATION | 导航提示 | 0-10 |
| STREAM_ALARM | 闹钟、警告 | 0-7 |
我建议你在声音设置中,增加一个“音量同步”功能。比如用户调大音乐音量时,导航音量也按比例增大。这样用户体验会好很多。
小技巧:在车载声音设置中,最好显示当前音量的“百分比”而不是“格数”。用户对百分比更敏感,调起来也更精确。
14.3 多用户设置管理
多用户设置,是车载系统的一个特色。你想想看,一辆车可能有好几个人开,每个人的设置偏好都不一样。
Android Automotive的多用户机制,基于UserManager。每个用户有自己的UserHandle,设置项存储在各自的Settings.System中。
定制多用户设置,需要注意:
- 用户切换:通过
UserManager.switchUser()来切换。但要注意,切换时最好保存当前用户的设置状态。 - 设置隔离:每个用户的Wi-Fi密码、蓝牙配对列表、音量设置都是独立的。不要混在一起。
- 管理员权限:有些设置项(比如工厂模式)只能由管理员用户修改。通过
UserManager.isAdminUser()来判断。
我曾经在项目中遇到一个问题:用户A设置了蓝牙耳机,切换到用户B后,蓝牙耳机还连着。后来加了onUserSwitch()回调,在切换时断开当前用户的蓝牙连接,才解决。
注意:多用户设置中,Settings.Global是全局共享的。如果你把某个设置项放在Settings.Global中,所有用户都会受影响。比如“屏幕亮度”,一般建议放在Settings.System中,每个用户独立。
14.4 工厂模式设置
工厂模式,是给产线和售后用的。它不面向普通用户,但咱们开发时必须做好。
工厂模式设置,通常包含:
- 硬件测试:屏幕、触摸、喇叭、麦克风、摄像头等。
- 系统信息:序列号、固件版本、MAC地址等。
- 恢复出厂设置:清除所有用户数据。
定制工厂模式,我建议你单独做一个FactorySettingsActivity,通过一个隐藏入口进入(比如在“关于本机”中连续点击版本号5次)。
嗯,这里有个关键点:工厂模式中的“恢复出厂设置”,一定要调用RecoverySystem.rebootWipeUserData()。不要自己手动删文件,否则容易出问题。
核心要点:工厂模式设置项,应该使用Settings.System中不常用的key来存储,比如factory_test_result。避免与普通设置项冲突。
我曾经在工厂模式中加了一个“屏幕坏点检测”功能。用户点击后,屏幕依次显示红、绿、蓝三色全屏。这个功能很简单,但产线工人特别喜欢,因为一眼就能看出屏幕有没有问题。
知识体系总览
下面这张图,帮你梳理本章的核心逻辑:
这张图展示了本章的核心脉络:从Settings应用架构出发,延伸到具体的设置项定制,再到多用户管理和工厂模式。每个模块之间都有依赖关系,但又是独立的。
好了,关于车载设置应用,咱们就聊到这儿。记住一句话:设置项是用户和车机交互的“第一道门”,做得好,用户觉得顺手;做不好,用户天天骂。希望你在实际项目中,能把这些经验用上。