通知概述

通知是 Android 在应用 UI 外部显示的消息,用于向用户提供提醒、来自其他人的通信或应用中的其他及时信息。用户可以点击通知以打开您的应用,或直接从通知中执行操作。

此页面概述了通知的显示位置和可用功能。要开始构建通知,请阅读 创建通知

有关通知设计和交互模式的更多信息,请参阅 通知设计指南

设备上的外观

通知会自动以不同的位置和格式显示给用户。通知会在状态栏中显示为图标,在通知抽屉中显示为更详细的条目,并在应用图标上显示为徽章。通知还会显示在配对的可穿戴设备上。

状态栏和通知抽屉

发布通知时,它首先会在状态栏中显示为图标。

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

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

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

用户可以向下拖动抽屉中的通知以展开视图,该视图会显示其他内容和操作按钮(如果提供)。从 Android 13 开始,此展开视图包含一个按钮,允许用户 停止具有正在进行的前台服务的应用

通知会保留在通知抽屉中,直到被应用或用户关闭。

抬头通知

从 Android 5.0 开始,通知可以短暂地显示在一个称为抬头通知的浮动窗口中。此行为通常用于用户需要立即了解的重要通知,并且仅在设备解锁时才会显示。

图 3. 抬头通知显示在前景应用的前面。

当您的应用发布通知时,抬头通知就会出现。它会在片刻后消失,但通常仍会在通知抽屉中可见。

可能触发抬头通知的条件包括以下内容

  • 用户的活动处于全屏模式,例如当应用使用 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() 设置。

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

有关如何使用这些功能创建通知以及更多信息的更多信息,请阅读 创建通知

通知操作

虽然不是必需的,但对于每个通知来说,点击时打开相应的应用活动是一个好习惯。除了此默认通知操作外,您还可以添加完成与应用相关的任务的 action 按钮——通常无需打开活动——如图 8 所示。

图 8. 带有 action 按钮的通知。

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

从 Android 10(API 级别 29)开始,平台可以自动使用建议的基于意图的操作生成 action 按钮。

创建通知 中将进一步解释添加 action 按钮。

需要解锁设备

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

在 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 及更高版本上更改每个渠道的重要性。

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

  • 紧急:发出声音并显示为悬浮式通知。

  • 高:发出声音。

  • 中:不发出声音。

  • 低:不发出声音,也不会出现在状态栏中。

所有通知,无论其重要性如何,都会出现在非中断系统 UI 位置,例如通知抽屉和启动器图标上的徽章。但是,您可以修改通知徽章的外观

更多信息,请阅读关于如何设置重要性

勿扰模式

从 Android 5.0(API 级别 21)开始,用户可以启用勿扰模式,该模式会使所有通知的铃声和振动静音。通知仍会像平时一样显示在系统 UI 中,除非用户另有指定。

勿扰模式下有三个级别:

  • 完全静音:阻止所有声音和振动,包括来自闹钟、音乐、视频和游戏的声音和振动。
  • 仅闹钟:阻止所有声音和振动,除了来自闹钟的声音和振动。
  • 仅优先级:用户可以配置哪些系统范围的类别可以中断他们,例如仅闹钟、提醒、事件、呼叫或消息。对于消息和呼叫,用户可以根据发送者或呼叫者进行筛选,如图 13 所示。

图 13. 用户可以根据系统范围的类别(左)和发送者或呼叫者(右)允许通知通过。

在 Android 8.0(API 级别 26)及更高版本上,用户还可以通过按渠道覆盖勿扰模式,从而允许应用特定类别(也称为渠道)的通知通过。例如,支付应用可能有与取款和存款相关的通知渠道。用户可以在优先级模式下允许取款通知、存款通知或两者。

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

要为这些用户设置配置您的通知,您必须设置系统范围的类别

前台服务的通知

当您的应用运行前台服务时,需要一个通知——一个在后台运行且对用户来说是长期存在且显眼的Service,例如媒体播放器。此通知不能像其他通知一样被关闭。要删除通知,必须停止服务或将其从前台状态中移除。

更多信息,请阅读前台服务。如果您正在构建媒体播放器,还可以阅读在后台播放媒体

发布限制

从 Android 8.1(API 级别 27)开始,应用每秒只能发出一次通知声音。如果您的应用在一秒钟内发布多个通知,它们都会按预期显示,但每秒钟只有第一个通知会发出声音。

但是,Android 在更新通知时也会应用速率限制。如果您过于频繁地发布对单个通知的更新,例如在一秒钟内发布许多更新,则系统可能会放弃更新。

通知兼容性

Android 通知系统 UI 和与通知相关的 API 持续发展。要在支持旧版设备的同时使用最新的通知 API 功能,请使用支持库通知 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

  • 全屏意图通知仅限于提供呼叫和闹钟的应用。使用NotificationManager.canUseFullScreenIntent API 检查您的应用是否具有权限。如果没有,您的应用可以使用ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT 启动设置页面,用户可以在该页面授予权限。

  • 更改了用户体验不可关闭通知的方式,允许用户即使设置了Notification.FLAG_ONGOING_EVENT标志,也可以关闭通知操作。如果设置了Notification.FLAG_ONGOING_EVENT标志,或者设备策略控制器 (DPC) 和企业支持包,则此更改不适用于CallStyle通知。当手机锁定时,或者用户选择全部清除时,此更改也不适用。