创建实时更新通知

系统会提升实时更新通知的优先级。升级的通知在系统界面上会更醒目地显示,包括在通知抽屉顶部、锁屏上以及状态栏中以功能块的形式显示。

图 1. 实时更新通知示例。

升级后的通知卡片具有以下外观特征:

  • 默认展开
  • 不可折叠

您的通知必须满足以下要求,才能成为实时更新:

促销特征

以下 API 可帮助您确定系统是否会提升您的通知:

  • Notification.FLAG_PROMOTED_ONGOING 表示通知是否已升级。
  • Notification.hasPromotableCharacteristics() 验证系统是否可以升级通知。此方法不会考虑用户是否在设置中为应用停用了实时更新。
  • NotificationManager.canPostPromotedNotifications() 检查您的应用是否可以发布推广通知,例如用户是否在设置中启用或停用了该通知。
  • Settings.ACTION_MANAGE_APP_PROMOTED_NOTIFICATIONS 是一种 intent 操作,可让应用将用户发送到“设置”以启用此功能。

使用条件

对于正在进行、由用户发起且对时间敏感的活动,请使用实时更新。

正在进行

实时更新必须表示正在积极进行的活动,并且具有明确的开始和结束时间。如果活动发生在过去,请勿使用实时更新。请改用标准通知。尚未开始的活动也是如此,不过即将开始的活动可以使用实时更新。

实时动态表示正在进行的活动。请勿使用实时更新来提供对应用功能的加速访问。如果您想这样做,请使用应用 widget 或自定义“快捷设置”功能块。

  • 适用场景:正在进行的导航、正在进行的通话、正在进行的网约车跟踪和正在进行的外卖跟踪。
  • 不当用途:广告、促销内容、聊天消息、提醒、即将到来的日历活动,以及对应用功能的快速访问。

用户自行播放

大多数实时更新应表示由用户明确触发的活动,例如开始锻炼、启动驾车导航或叫网约车。请勿在实时更新中显示环境信息,例如用户环境、兴趣或即将发生的活动的相关信息。不允许由其他方触发的活动生成实时更新。

有时,用户可能会执行一项操作,该操作会在未来某个时间启动 activity。例如,如果用户购买了机票或音乐会门票、报名参加比赛,或者以其他方式表明他们将来会参加时限性活动。在这些情况下,可以在预定活动开始时自动显示实时更新。不过,应用必须调整其触发器,使其仅在活动即将开始时显示。如果用户明确表示要开始监控某个后台事件(例如体育赛事),您可以开始针对该事件发布实时更新。 不过,您还应在关联的通知中添加取消固定操作。

具有时效性

仅当用户在整个活动期间都需要关注实时更新时,才显示实时更新。实时更新的一个主要使用场景是监控,用户可以通过快速查看实时更新来密切关注活动的进展情况,从而获得显著的益处。

实时更新通常适用于在实时更新和常规通知之间转换的活动。例如,在用户航班起飞前数小时显示登机牌通知是合适的,但只有在用户有迫切需求时(例如,当用户到达机场或活动场地时,或者登机开始后),该通知才应变为实时更新。相比之下,实时更新不适合跟踪软件包,因为用户无需持续监控。

状态条状标签

借助状态提示,用户可以在通知未显示时跟踪实时更新。使用 setShortCriticalTextsetWhen 传达与进度中心通知相关的重要状态信息。

带有图标的状态条状标签
图 2. 不确定状态会显示小图标 Notification.Builder#setSmallIcon
带有时间的动态条状标签
图 3. 使用 Notification.Builder#setShortCriticalText 显示绝对时间。
带有信息的状态条状标签
图 4. 使用 Notification.Builder#setShortCriticalText 传达关键信息。

时间

当时间会触发通知时长的倒计时,除非通知被关闭或更新。

  • “何时”时间至少比当前时间晚 2 分钟:如果当前时间为上午 10:05,而“何时”时间设置为上午 10:10,则芯片会显示“5 分钟”。
  • 如果“何时”时间是 1 分钟之前,则不会显示通知。
  • 如果您不希望通知在通知栏中显示时间,请使用 setShowWhen 进行 FALSE

状态条状标签外观

状态条状标签始终包含一个图标,并且可以选择性地包含文本。微件的最大宽度为 96dp。根据以下条件显示文本:

  • 如果少于 7 个字符,则显示整个文本。
  • 如果只有不到一半的文字会显示,则仅显示图标。
  • 如果超过一半的文字会显示,请尽可能多地显示文字。

关闭

用户可以在通知栏中控制通知的显示情况。发布不必要的实时更新可能会导致用户撤消应用的发布权限。

为防止用户完全停用实时更新,请避免发布用户可能会关闭的更新。不要重新发布用户已关闭的实时更新。使用 setDeleteIntent 检测已关闭的更新。

如需试用这些 API,请参阅示例应用