通知概览

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

您可以通过自定义通知在可穿戴设备上的外观,并提供不同的操作(包括建议回复和语音输入回复)来增强体验。有关更多信息,请参阅如何为通知添加可穿戴设备专用功能

图 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 功能,请使用 Support Library 通知 API、NotificationCompat 及其子类,以及 NotificationManagerCompat。这使您可以避免编写条件代码来检查 API 级别,因为这些 API 会处理它。

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

以下是按 API 级别划分的 Android 通知最显著的行为更改摘要。

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 通知。当手机锁定或用户选择全部清除时,此规则也不适用。

通知行为

冷静期

Android 15.0,API 级别 35

Android 15 引入了通知冷静期功能,旨在改善快速连续到达的通知体验。此功能可在长达两分钟内降低重复通知的显示、音量和振动强度。

需要音频和触觉以引起注意的关键通知不受冷静期限制。用户可以在“设置”中关闭通知冷静期。

图 9. 通知冷静期设置。

以下是查找通知冷静期设置的示例:

Kotlin

val intent = Intent(Settings.ACTION_MANAGE_ADAPTIVE_NOTIFICATIONS)
val pendingIntent =
            PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)

Java

Intent intent = new Intent(Settings.ACTION_MANAGE_ADAPTIVE_NOTIFICATIONS)
PendingIntent pendingIntent =
            PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)