通知概览

通知是指 Android 在您应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或您应用中的其他实时信息。用户可以点按通知来打开应用,或直接从通知中执行操作。

本页将概要介绍通知的显示位置及可用功能。如果您想着手构建通知,请改为阅读创建通知

如需详细了解具体设计和互动模式,请参阅通知设计指南。此外,还可以参阅 Android 通知示例,查看有关在移动应用和穿戴式应用中使用 Notification.Style API 的最佳做法演示。

在设备上的外观

通知可以在不同的位置以不同的格式显示,例如,状态栏中的图标、抽屉式通知栏中比较详细的条目、应用图标上的标志,以及在配对的穿戴式设备上自动显示。

状态栏和抽屉式通知栏

发出通知后,通知会先以图标的形式显示在状态栏中。

图 1. 通知图标显示在状态栏的左侧

用户可以在状态栏向下滑动以打开抽屉式通知栏,并在其中查看更多详情及对通知执行操作。

图 2. 抽屉式通知栏中的通知

用户可以向下拖动抽屉式通知栏中的某条通知以查看展开后的视图,其中会显示更多内容以及操作按钮(如果有)。

在应用或用户关闭通知之前,通知会一直显示在抽屉式通知栏中。

提醒式通知

从 Android 5.0 开始,通知可以短暂地显示在浮动窗口中,称之为提醒式通知。这种行为通常适用于用户应立即知晓的重要通知,而且仅在设备未锁定时才会显示。

图 3. 显示在前台应用前面的提醒式通知

提醒式通知会在应用发出通知后立即出现,稍后便会消失,但仍照常显示在抽屉式通知栏中。

例如,以下情况可能会触发提醒式通知:

  • 用户的 Activity 处于全屏模式(应用使用 fullScreenIntent)。
  • 通知的优先级很高,且在搭载 Android 7.1(API 级别 25)及更低版本的设备上使用铃声或振动。
  • 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,通知渠道的重要程度比较高。

锁定屏幕

从 Android 5.0 开始,通知可以显示在锁定屏幕上。

您可以采用编程方式设置您的应用在安全锁定屏幕上所发布通知的详情可见等级,甚至可以设置通知是否显示在锁定屏幕上。

用户可以通过系统设置来选择锁定屏幕通知的详情可见等级,包括选择停用所有锁定屏幕通知。从 Android 8.0 开始,用户可以选择停用或启用各个通知渠道的锁定屏幕通知。

图 4. 锁定屏幕上已隐藏敏感内容的通知

要了解详情,请参阅如何设置锁定屏幕的可见性

应用图标的标志

在搭载 Android 8.0(API 级别 26)及更高版本的设备上支持的启动器中,应用图标通过在相应的应用启动器图标上显示彩色“标志”(又称“通知圆点”)来表示有新通知。

用户可以长按应用图标来查看该应用的通知。然后,用户可以从该长按菜单中关闭通知或者对通知执行操作(与抽屉式通知栏类似)。

图 5. 通知标志和长按菜单

要详细了解标志的工作原理,请阅读通知标志

Wear OS 设备

如果用户有配对的 Wear OS 设备,那么您的所有通知都会自动显示在已配对设备上,包括展开式详情和操作按钮。

您还可以通过自定义通知在穿戴式设备上的外观以及提供不同的操作选项(包括建议的回复和语音输入回复)来提升用户体验。如需了解详情,请参阅如何向通知中添加特定于穿戴式设备的功能

图 6. 通知自动显示在已配对的 Wear OS 设备上

通知剖析

通知的设计由系统模板决定,您的应用只需要定义模板中各个部分的内容即可。通知的部分详情仅在展开后的视图中显示。

图 7. 包含基本详情的通知

图 7 展示了通知最常见的部分,具体如下所示:

  1. 小图标:必须提供,通过 setSmallIcon() 进行设置。
  2. 应用名称:由系统提供。
  3. 时间戳:由系统提供,但您可以使用 setWhen() 替换它或者使用 setShowWhen(false) 隐藏它。
  4. 大图标:可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过 setLargeIcon() 进行设置。
  5. 标题:可选内容,通过 setContentTitle() 进行设置。
  6. 文本:可选内容,通过 setContentText() 进行设置。

我们强烈建议您使用系统模板,以确保设计能够很好地兼容所有设备。不过,如有必要,您可以创建自定义通知布局

如需详细了解如何创建包含上述功能及其他功能的通知,请参阅创建通知

通知操作

尽管并非强制要求,但每个通知都应在被点按时打开相应的应用 Activity。除了这种默认的通知操作之外,您还可以添加可在通知中完成与应用相关任务的操作按钮(通常不需要打开 Activity),如图 9 所示。

图 9. 包含操作按钮的通知

从 Android 7.0(API 级别 24)开始,您还可以添加直接在通知中回复消息或输入其他文字的操作。

从 Android 10(API 级别 29)开始,平台可以自动生成操作按钮,此类按钮包含基于 intent 的建议操作。

创建通知一文详细介绍了如何添加操作按钮。

展开式通知

默认情况下,通知的文字内容会被截断以放在一行。如果您需要长一些的通知,可以通过应用其他模板启用更大的展开式文本区域,如图 8 所示。

图 8. 适合更多文本的展开式通知

您还可以使用图片、收件箱样式、聊天对话或媒体播放控件来创建展开式通知。如需了解详情,请阅读创建展开式通知

通知更新和分组

为了使用户在您提供后续更新时不会遭遇多个通知或多余的通知轰炸,您不妨考虑更新现有通知(而不是发出新通知),或者考虑使用收件箱样式的通知来显示会话更新。

不过,如有必要发出多个通知,则应将这些孤立的通知分为一组(可在搭载 Android 7.0 及更高版本的设备上这样做)。借助通知组,您可以以一条摘要的形式在抽屉式通知栏中将多个通知收拢成一条通知消息。用户便可以展开通知以查看每个通知的详情。

用户可以逐级展开通知组以及其中的每条通知以查看详情。

图 10. 收起和展开后的通知组

如需了解如何将通知添加到某个组,请参阅创建通知组

通知渠道

从 Android 8.0(API 级别 26)开始,必须为所有通知分配渠道,否则通知将不会显示。通过将通知归类到不同的渠道中,用户可以停用您应用的特定通知渠道(而非停用您的所有通知),还可以控制每个渠道的视觉和听觉选项,所有这些操作都在 Android 系统设置中完成(如图 11 所示)。用户还可以长按通知以更改所关联渠道的行为。

在搭载 Android 7.1(API 级别 25)及更低版本的设备上,用户仅可以按应用来管理通知(在搭载 Android 7.1 及更低版本的设备上,每个应用其实只有一个渠道)。

图 11. 时钟应用及该应用的某个渠道的通知设置

一个应用可以有多个通知渠道(每个渠道对应于该应用发出的每类通知)。应用还可以创建通知渠道来响应您应用的用户做出的选择。例如,您可以为用户在短信应用中创建的每个会话组设置单独的通知渠道。

在搭载 Android 8.0 及更高版本的设备上,渠道还可用于指定通知的重要程度等级。因此,发布到同一通知渠道的所有通知的行为都相同。

要了解详情,请参阅创建和管理通知渠道

通知的重要程度

Android 利用通知的重要程度来决定通知应在多大程度上干扰用户(视觉上和听觉上)。通知的重要程度越高,干扰程度就越高。

在搭载 Android 8.0(API 级别 26)及更高版本的设备上,通知的重要程度由通知发布到的渠道的 importance 决定。用户可以在系统设置中更改通知渠道的重要程度(图 12)。 在搭载 Android 7.1(API 级别 25)及更低版本的设备上,每条通知的重要程度均由通知的 priority 决定。

图 12. 在搭载 Android 8.0 及更高版本的设备上,用户可以更改每个渠道的重要程度

可能的重要程度等级如下所示:

  • 紧急:发出提示音,并以提醒式通知的形式显示。
  • 高:发出提示音。
  • 中:无提示音。
  • 低:无提示音,且不会在状态栏中显示。

无论重要程度如何,所有通知都会在非干扰性的系统界面位置显示,例如,显示在抽屉式通知栏中,以及在启动器图标上作为标志显示(但您可以修改通知标志的外观)。

如需了解详情,请参阅如何设置重要程度

勿扰模式

从 Android 5.0(API 级别 21)开始,用户可以启用勿扰模式,以关闭所有通知的提示音和振动。通知仍会在系统界面中照常显示,除非用户另有指定。

勿扰模式包含 3 种不同的级别:

  • 完全静音:阻止所有提示音和振动(包括闹钟、音乐、视频和游戏)。
  • 仅限闹钟:阻止所有提示音和振动,闹钟除外。
  • 仅限优先事项:用户可以配置哪些系统级类别可以打扰他们(如仅限闹钟、提醒、活动、来电或短信等)。对于短信和来电,用户还可以选择根据发送者或来电者进行过滤(图 13)。

图 13. 用户可以根据系统级类别(左侧)和短信发送者或来电者(右侧)允许显示通知。

在搭载 Android 8.0(API 级别 26)及更高版本的设备上,用户还可以通过按渠道替换勿扰模式来允许特定于应用的类别(又称渠道)显示通知。例如,付款类应用可能会有与取款和存款相关的通知渠道。用户便可以选择允许在优先模式下显示取款通知和/或存款通知。在搭载 Android 7.1(API 级别 25)及更低版本的设备上,用户可以按应用(而不是按渠道)允许显示通知。

要针对上述用户设置合理配置您的通知,您必须设置系统级类别和渠道

前台服务的通知

如果您的应用正在运行“前台服务”(一种长时间在后台运行且用户可以察觉到的 Service,如媒体播放器),则需要发出通知。不能像关闭其他通知那样关闭这种通知。要移除此类通知,必须停止运行服务或者将其从“前台”状态中移除。

要了解详情,请阅读在前台运行服务。如果您要构建媒体播放器,另请参阅对前台服务使用 MediaStyle 通知

发布限制

从 Android 8.1(API 级别 27)开始,应用无法每秒发出一次以上的通知提示音。如果应用在一秒内发出了多条通知,这些通知都会按预期显示,但是每秒中只有第一条通知发出提示音。

不过,Android 还对通知更新频率设定了限制。如果您过于频繁地发布有关某条通知的更新(不到一秒内发布多个),系统可能会放弃部分更新。

通知的兼容性

自 Android 1.0 开始,通知系统界面以及与通知相关的 API 就在不断发展。如需在使用最新通知 API 功能的同时仍然支持旧版设备,请使用支持库通知 API:NotificationCompat 及其子类,以及 NotificationManagerCompat。这样一来,您就无需编写条件代码来检查 API 级别,因为这些 API 会为您代劳。

NotificationCompat 随着平台的发展不断更新,旨在纳入最新的方法。需要注意的是,某个方法在 NotificationCompat 中可用并不能保证可以在旧版设备上提供相应功能。在某些情况下,调用新引入的 API 会导致旧版设备出现空操作。例如,NotificationCompat.addAction() 仅在搭载 Android 4.1(API 级别 16)及更高版本的设备上显示操作按钮。

下面总结了 Android 通知的一些最重要的行为变化。

Android 4.1,API 级别 16

  • 推出了展开式通知模板(称为通知样式),可以提供较大的通知内容区域来显示信息。用户可以通过单指向上/向下滑动的手势来展开通知。
  • 还支持以按钮的形式向通知添加其他操作。
  • 允许用户在设置中按应用关闭通知。

Android 4.4,API 级别 19 和 20

  • 向 API 中添加了通知监听器服务。
  • API 级别 20 中新增了 Android Wear(现已更名为 Wear OS)支持。

Android 5.0,API 级别 21

  • 推出了锁定屏幕和提醒式通知。
  • 用户现在可以将手机设为勿扰模式,并配置允许哪些通知在设备处于“仅限优先事项”模式时打扰他们。
  • 向 API 集添加了通知是否在锁定屏幕上显示的方法 (setVisibility()),以及指定通知文本的“公开”版本的方法。
  • 添加了 setPriority() 方法,告知系统通知的“干扰性”(例如,将其设为“高”可使通知以提醒式通知的形式显示)。
  • 向 Android Wear(现已更名为 Wear OS)设备添加了通知堆栈支持。使用 setGroup() 将通知放入堆栈。请注意,平板电脑和手机尚不支持通知堆栈。通知堆栈以后会称为组或 Bundle。

Android 7.0,API 级别 24

  • 重新设置了通知模板的样式以强调主打图片和头像。
  • 添加了三个通知模板:一个用于短信应用,另外两个用于借助展开式选项和其他系统装饰来装饰自定义内容视图。
  • 向手持设备(手机和平板电脑)添加了对通知组的支持。使用与 Android 5.0(API 级别 21)中推出的 Android Wear(现已更名为 Wear OS)通知堆栈相同的 API。
  • 用户可以使用内嵌回复功能直接在通知内进行回复(他们输入的文本将转发到通知的父应用)。

Android 8.0,API 级别 26

  • 现在必须将各个通知放入特定渠道中。
  • 现在,用户可以按渠道关闭通知,而非关闭来自某个应用的所有通知。
  • 包含有效通知的应用将在主屏幕/启动器屏幕上相应应用图标的上方显示通知“标志”。
  • 现在,用户可以从抽屉式通知栏中暂停某个通知。您可以为通知设置自动超时时间。
  • 您还可以设置通知的背景颜色。
  • 部分与通知行为相关的 API 已从 Notification 移至 NotificationChannel。例如,在搭载 Android 8.0 及更高版本的设备中,使用 NotificationChannel.setImportance(),而非 NotificationCompat.Builder.setPriority()