通知可在应用未使用时及时向驾驶员提供有关应用事件的简短信息。通知可以显示在通知中心,有些通知也可以作为浮动通知显示在显示屏上。如需创建适用于 Android Automotive OS 的通知,可以使用与其他设备相同的 NotificationBuilder API。不过,为了帮助确保驾驶员的安全并最大限度减少干扰,某些 API 方法和类会受到限制或有不同的行为。
车内通知有何不同
为营造无干扰的安全驾驶环境,Android Automotive OS 中的通知与其他设备上的通知在以下几个方面有所不同:
- 简化的用户互动
- 基于驾驶状态的用户体验限制
简化的用户互动
为了帮助确保驾驶员能够专注于驾驶,车内的通知采用简化的用户互动模型,其特征如下:
- 没有复杂控件
- 通知不允许使用复杂控件,例如点按以展开通知、长按通知以获取其他选项,或使用基于滑动长度手势的控件。
- 通知提示音
- 通知仅在触发浮动通知时才会播放声音。
- Android Automotive OS 会自动为所有与汽车兼容的消息通知添加播放和静音按钮。 - 播放:使用用户的默认数字助理(例如 Google 助理)或车辆的默认文字转语音系统向驾驶员播报通知。
- 静音:在剩下的驾驶行程中,禁止显示对话中所有后续消息的浮动通知。静音对话中的消息通知仍然会显示在通知中心,驾驶员也可以从通知中心取消对话静音。 
 
- 简化的通知显示选项
- 不支持 - RemoteViews和自定义内容视图。另外,也不支持以下通知样式:- BigPictureStyle
- BigTextStyle
- InboxStyle
- ProgressStyle
 - 如果您的应用使用上述某种通知样式向 Android Automotive OS 发送通知,则仅会显示摘要文本。 
- 简化的通知渠道管理
- 为了降低 Automotive 设备中丰富的管理任务的普遍性,Android Automotive OS 不支持通知渠道和相关的界面功能。 
基于驾驶状态的用户体验限制
Android Automotive OS 包含用户体验限制引擎。汽车制造商可以利用此引擎通过以下方式根据汽车的驾驶状态限制通知:
- 将通知字符串截断为特定的字符长度
- 隐藏 CATEGORY_MESSAGE通知的消息摘要
- 限制通知中心可以显示的通知数量
支持的资源类型
默认情况下,Android Automotive OS 仅支持可在其他设备上的通知中使用的资源类型中的一部分:这个子集包括以下资源类型:
- 可绘制对象
- 图标
- 图片
消息通知兼容性要求
为了提供一致的用户体验并最大限度地减少干扰,消息通知对 Android Automotive OS 有特殊要求。
如果消息通知满足以下要求,则与汽车兼容:
- 属于 CATEGORY_MESSAGE类别。
- 使用 Notification.MessagingStyle样式。
- 只包含未读消息。
- 具有满足以下要求的“标记为已读” - Action:- 语义操作设置为 Action.SEMANTIC_ACTION_MARK_AS_READ。
- Action指明在触发时不会显示任何界面。
 
- 语义操作设置为 
- 如果通知有回复 - Action,则- Action应满足以下要求:- 语义操作设置为 Action.SEMANTIC_ACTION_REPLY。
- Action指明在触发时不会显示任何界面。
- Action包含单个- RemoteInput。
 
- 语义操作设置为 
通知中心
几乎所有通知都会显示在通知中心内,即使这些通知也会以浮动通知的形式触发。通知会在整个驾驶行程内保留在通知中心中。
驾驶员可以在通知中心内与通知互动。根据汽车制造商的不同,驾驶员可以通过以下一种或两种方式访问通知中心:
- 从屏幕顶部向下滑动,类似于其他设备上的抽屉式通知栏。
- 点按系统界面中的按钮。
分组通知
在通知中心内,相关的通知会自动分组在一起,这和其他设备上的抽屉式通知栏一样。但是,当驾驶员点按通知中心内某个分组的摘要时,分组会展开以显示其中包含的所有通知,而不会启动 PendingIntent。
通知中心不显示的通知
通知中心不显示以下通知:
- Media playback条通知。Android Automotive OS 会收集有关正在播放的媒体的信息,并将其显示在界面上的专门位置。请注意,必须使用非 null 令牌调用- setMediaSession,通知才能被识别为媒体播放。
- CATEGORY_NAVIGATION的精细导航通知。
- 系统特权应用以及使用平台密钥签名的应用的前台服务通知。这些通知的重要性级别低于 IMPORTANCE_DEFAULT。
浮动通知
浮动通知以通知卡片的形式显示在屏幕顶部。由于浮动通知会吸引驾驶员的注意力,因此应用只在信息对驾驶至关重要、需要尽快处理和可操作时才触发浮动通知。只有特定类别的通知才能触发浮动通知。
汽车制造商可以决定是否允许在通知中心打开期间显示浮动通知。
应用如何触发浮动通知
应用对于触发浮动通知有不同的要求,具体取决于它们是否具有系统特权。
- 系统特权应用和使用平台密钥签名的应用
- 应用可以通过将通知渠道的重要性设置为 IMPORTANCE_HIGH或更高级别来触发浮动通知。
- 所有其他应用
- 只要将通知渠道的重要性设置为 - IMPORTANCE_HIGH或更高级别,并确保通知属于以下类别之一,应用就能触发浮动通知:
浮动通知的生命周期
应用触发浮动通知后,通知会立即显示在汽车屏幕上。如果驾驶员不采取任何操作,浮动通知会在 8 秒后自动关闭,但以下情况下除外:
- 某些来电的浮动通知无法关闭,浮动通知会一直保持到驾驶员接听电话或呼叫终止。通知必须满足以下要求,才能成为不可关闭的来电浮动通知: - 属于 CATEGORY_CALL
- 设置了全屏 intent
- 使用 setOngoing()方法标记为进行中
 
- 属于 
- 如果应用在 8 秒内更新了浮动通知,通知会继续显示。 
除 CATEGORY_NAVIGATION 通知外,浮动通知关闭后,相应通知会显示在通知中心内。
面向汽车的 Notification API 变更和限制
本节总结了 Notification API 在 Android Automotive OS 中具有不同行为或具有限制的各个类的区别。
Notification.Builder
表 1 和表 2 介绍了 Notification.Builder 类中的 API 变更和限制。
表 1. 公开方法变更 - Notification.Builder
| 公开方法 | 效果 | 说明 | ||
|---|---|---|---|---|
| 
 | 有条件空操作 | Notification.MessagingStyle通知必须添加兼容性要求中指定的操作。添加的任何其他操作都不会呈现为通知按钮。 | ||
| 
 
 
 
 
 
 
 | 空操作 | 不支持 RemoteViews和自定义内容视图。 | ||
| 
 
 | 空操作 | 不支持通知标记。 | ||
| 
 
 | 空操作 | 不支持倒数计时器。 | ||
| setColorized() | 约束发生了变化 | 平台签名的应用:可配置;默认支持。 系统特权应用:由平台配置;默认不支持。 所有其他应用:由平台配置;默认不支持。 | ||
| setFullScreenIntent() | 行为发生了变化 | 不自动启动 intent。 | ||
| setLargeIcon() | 行为发生了变化 | 在通知右侧显示大图标。 | ||
| setLights() | 空操作 | Android Automotive OS 设备没有 LED 指示灯。 | ||
| setOngoing() | 行为发生了变化 | 当通知也会触发浮动通知时,行为有所不同。 只有在浮动通知是针对来电的情况下, | 空操作 | 不支持隐私模式。 | 
| setSettingsText() | 空操作 | 通知不提供访问应用设置的链接, 驾驶员需通过应用访问应用设置。 | ||
| setTicker() | 空操作 | 不支持置顶栏文本。 | 
表 2. 嵌套类变更 - Notification.Builder
| 嵌套类 | 效果 | 说明 | 
|---|---|---|
| 
 
 
 | 未使用 | 仅显示摘要文本。不支持这些样式的详细通知。 | 
| Notification.BubbleMetadata | 未使用 | 不支持气泡。 | 
| Notification.MediaStyle | 隐藏 | 这种样式的通知会被隐藏。Android Automotive OS 管理媒体通知和播放的界面互动。 | 
| Notification.MessagingStyle | 行为发生了变化 | 这种样式的通知有以下不同: 
 | 
| 
 
 | 未使用 | 不支持扩展程序。 | 
Notification.Action.Builder
表 3 介绍了 Notification.Action.Builder 类中的 API 变更和限制。
表 3. 公开方法变更 - Notification.Action.Builder
| 公开方法 | 效果 | 说明 | 
|---|---|---|
| 公开构造函数 | 行为发生了变化 | 公开构造函数中指定的图标会被忽略。 | 
| addRemoteInput | 行为发生了变化 | 为了最大程度减少驾驶员分散注意力的问题,数字助理(例如 Google 助理)会为用户在消息中插入回答。用户不能输入消息。 | 
| setAllowGeneratedReplies | 空操作 | 不支持智能回复。 | 
