通知概览

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

本页将概要介绍通知的显示位置及可用功能。如需开始构建通知,请阅读创建通知

如需详细了解通知设计和互动模式,请参阅通知设计指南

在设备上的外观

通知会自动向不同位置以不同格式的用户显示。 通知以图标的形式显示在状态栏中,在抽屉式通知栏中显示更详细的条目,并在应用图标上显示标记。通知也会显示在配对的穿戴式设备上。

状态栏和抽屉式通知栏

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

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

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

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

用户可以向下拖动抽屉式通知栏中的某条通知以查看展开后的视图,其中会显示更多内容以及操作按钮(如果有)。从 Android 13 开始,此展开视图包含一个按钮,可让用户停止具有持续前台服务的应用

通知会一直显示在抽屉式通知栏中,直到被应用或用户关闭为止。

提醒式通知

从 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 设备,您的所有通知都会自动显示在配对的 Wear OS 设备上,包括可展开的详细信息和操作按钮。

您可以通过自定义通知在穿戴式设备上的外观并提供不同的操作(包括建议的回复和语音输入回复)来改善体验。如需了解详情,请参阅如何向通知添加穿戴式设备专属功能

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

通知剖析

通知的设计由系统模板决定,而您的应用会定义模板各个部分的内容。通知的某些详细信息仅在展开视图中显示。

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

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

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

我们强烈建议您使用系统模板,以确保设计在所有设备上的兼容性。如有必要,您可以创建自定义通知布局

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

通知操作

虽然并非强制性要求,但最好是让每条通知在被点按时打开相应的应用 activity。除了此默认通知操作之外,您还可以添加操作按钮,用于在通知中完成应用相关任务(通常无需打开 activity),如图 8 所示。

图 8. 包含操作按钮的通知。

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

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

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

要求解锁设备

用户可能会在设备的锁定屏幕上看到通知操作。如果通知操作导致应用启动 activity 或发送直接回复,则用户必须解锁设备,然后应用才能调用该通知操作。

在 Android 12(API 级别 31)及更高版本中,您可以将通知操作配置为必须解锁设备才能让应用调用该操作,无论该操作启动什么工作流。此选项会为锁定设备上的通知增加一道额外的安全保障。

如需要求在应用调用指定的通知操作之前解锁设备,请在创建通知操作时将 true 传入 setAuthenticationRequired(),如以下代码段所示:

Kotlin

val moreSecureNotification = Notification.Action.Builder(...)

    // This notification always requests authentication when invoked
    // from a lock screen.
    .setAuthenticationRequired(true)
    .build()

Java

Notification moreSecureNotification = new Notification.Action.Builder(...)

    // This notification always requests authentication when invoked
    // from a lock screen.
    .setAuthenticationRequired(true)
    .build();

展开式通知

默认情况下,通知的文字内容会被截断以放在一行。如果您想要更长的通知,可以应用额外的模板来启用更大的可展开文本区域,如图 9 所示。

图 9. 适用于大型文本的展开式通知。

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

通知更新和分组

为避免在有其他更新时向用户发送多条通知或多余的通知,请更新现有通知(而不是发出新通知)或使用收件箱样式的通知来显示会话更新。

但是,如果需要传递多个通知,请考虑将单独的通知分为一组,该组适用于 Android 7.0 及更高版本。

借助通知组,您可以通过摘要将多个通知收起到抽屉式通知栏中的一篇博文中。用户可以逐步展开通知组及其中的每个通知,以查看更多详细信息,如图 10 所示。

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

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

通知渠道

从 Android 8.0(API 级别 26)开始,所有通知都必须分配给某个渠道,否则通知将不会显示。这样,用户就可以停用应用的特定通知渠道,而不是停用所有通知。用户可以通过 Android 系统设置控制每个频道的视觉和听觉选项,如图 11 所示。用户还可以轻触并按住通知,以更改关联频道的行为。

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

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

应用可以针对应用发出的每种通知类型使用单独的渠道。应用还可以创建通知渠道来响应用户做出的选择。例如,您可以为用户在短信应用中创建的每个对话组设置单独的通知渠道。

在 Android 8.0 及更高版本中,您还可以在该渠道中指定通知的重要性级别,以便发布到同一通知渠道的所有通知都具有相同的行为。具体内容将在下一部分进行介绍。

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

通知的重要程度

Android 利用通知的重要程度来确定通知在视觉和听觉上干扰用户的程度。通知的重要性越高,干扰程度就越高。

在 Android 7.1(API 级别 25)及更低版本中,通知的重要性由通知的 priority 决定。

在 Android 8.0(API 级别 26)及更高版本中,通知的重要性由通知发布到的渠道的 importance 决定。用户可以在系统设置中更改通知渠道的重要性,如图 12 所示。

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

可能的重要性级别和相关的通知行为如下:

  • 紧急:发出提示音,并以浮动通知的形式显示。

  • 高:发出提示音。

  • 中:不发出声音。

  • 低:不发出提示音,且不显示在状态栏中。

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

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

勿扰模式

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

“请勿打扰”模式有三个级别:

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

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

在 Android 8.0(API 级别 26)及更高版本中,用户还可以通过按渠道替换勿扰模式来允许应用专属类别(也称为渠道)显示通知。例如,付款应用可能具有与取款和存款相关的通知渠道。在优先模式下,用户可以允许显示取款通知和/或存款通知。

在搭载 Android 7.1(API 级别 25)及更低版本的设备上,用户可以按应用(而不是按渠道)允许发送通知。

如需为这些用户设置配置通知,您必须设置系统级类别

前台服务的通知

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

如需了解详情,请参阅前台服务。如果您要构建媒体播放器,另请参阅在后台播放媒体

帖子限制

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

不过,Android 还对通知更新频率设定了限制。如果您过于频繁地发布单个通知的更新(例如在不到一秒内发布多个通知),系统可能会丢弃更新。

通知的兼容性

Android 通知系统界面以及与通知相关的 API 一直在不断完善。如需在支持旧版设备的同时使用最新的通知 API 功能,请使用支持库通知 API、NotificationCompat 及其子类以及 NotificationManagerCompat。这样一来,您就无需编写条件代码来检查 API 级别,因为这些 API 会处理这些级别。

NotificationCompat 会随着平台的发展而更新,以纳入最新的方法。不过,某个方法在 NotificationCompat 中可用并不能保证在旧设备上提供相应功能。在某些情况下,调用新引入的 API 会导致在旧设备上出现空操作。

下面总结了 Android 通知中各 API 级别最显著的行为变更。

Android 5.0,API 级别 21

  • 引入了锁定屏幕和浮动通知。

  • 允许用户将手机设为勿扰模式,并配置允许哪些通知在设备处于“仅限优先事项”模式时打扰他们。

  • 添加了用于设置是否在锁定屏幕上显示通知(例如 setVisibility())的方法,以及指定通知文本的“公开”版本的方法。

  • 添加了 setPriority() 方法,用于告知系统通知的干扰程度。例如,将优先级设置为“高”会使通知显示为浮动通知。

  • 向 Android Wear(现已更名为 Wear OS)设备添加通知堆栈支持。使用 setGroup() 将通知放入堆栈。在 Android 7.0(API 级别 24)之前,平板电脑或手机不支持通知堆栈(后来称为组或捆绑)。

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()

Android 13.0,API 级别 33

Android 14.0,API 级别 34

  • 仅限提供来电和闹钟的应用接收全屏 intent 通知。使用 NotificationManager.canUseFullScreenIntent API 检查您的应用是否具有权限。如果未授予,您的应用可以使用 ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT 启动设置页面,用户可以在该页面中授予权限。

  • 通过允许用户关闭通知操作(即使设置了 Notification.FLAG_ONGOING_EVENT 标志),改变了用户体验不可关闭的通知的方式。如果设置了 Notification.FLAG_ONGOING_EVENT 标志,或者设置了面向企业的设备政策控制器 (DPC) 和支持软件包,则这不适用于 CallStyle 通知。当手机处于锁定状态或选择全部清除时,上述情况也不适用。