通知是 Android 在应用 UI 外部显示的消息,用于向用户提供提醒、来自其他人的通信或来自应用的其他及时信息。用户可以点击通知以打开应用或直接从通知中执行操作。
此页面概述了通知的显示位置和可用功能。要开始构建通知,请阅读创建通知。
有关通知设计和交互模式的更多信息,请参阅通知设计指南。
设备上的外观
通知会自动以不同的位置和格式显示给用户。通知以状态栏中的图标、通知抽屉中的更详细的条目以及应用图标上的徽章的形式出现。通知也会出现在配对的可穿戴设备上。
状态栏和通知抽屉
当您发出通知时,它首先会以状态栏中的图标形式出现。
用户可以向下滑动状态栏以打开通知抽屉,在其中可以查看更多详细信息并对通知执行操作。
用户可以向下拖动抽屉中的通知以显示展开视图,该视图显示其他内容和操作按钮(如果提供)。从 Android 13 开始,此展开视图包含一个按钮,允许用户停止具有正在进行的前台服务的应用。
通知保留在通知抽屉中可见,直到应用或用户将其关闭。
抬头通知
从 Android 5.0 开始,通知可以短暂地显示在一个称为抬头通知的浮动窗口中。此行为通常用于用户需要立即了解的重要通知,并且仅在设备解锁时才会出现。
当您的应用发出通知时,会显示抬头通知。它会在片刻后消失,但它会像往常一样保留在通知抽屉中可见。
可能触发抬头通知的条件包括以下内容
用户的活动处于全屏模式,例如当应用使用
fullScreenIntent
时。通知具有高优先级,并在运行 Android 7.1(API 级别 25)及更低版本的设备上使用铃声或振动。
在运行 Android 8.0(API 级别 26)及更高版本的设备上,通知渠道具有高重要性。
锁定屏幕
从 Android 5.0 开始,通知可以显示在锁定屏幕上。
您可以以编程方式设置您的应用发布的通知是否显示在安全的锁定屏幕上,以及如果显示,则可见的详细信息级别。
用户可以使用系统设置来选择在锁定屏幕通知中可见的详细信息级别或禁用所有锁定屏幕通知。从 Android 8.0 开始,用户可以为每个通知渠道禁用或启用锁定屏幕通知。
要了解更多信息,请参阅设置锁定屏幕可见性。
应用图标徽章
在运行 Android 8.0(API 级别 26)及更高版本的设备上的受支持启动器中,应用图标会使用彩色徽章(称为通知点)在相应的应用启动器图标上指示新通知。
用户可以触摸并按住应用图标以查看该应用的通知。用户可以从该菜单关闭或操作通知,类似于通知抽屉。
要了解有关徽章工作原理的更多信息,请阅读修改通知徽章。
Wear OS 设备
如果用户拥有配对的 Wear OS 设备,则所有通知都会自动显示在那里,包括可扩展的详细信息和操作按钮。
您可以通过自定义通知在可穿戴设备上的外观以及提供不同的操作(包括建议的回复和语音输入回复)来增强体验。有关更多信息,请参阅如何向您的通知添加特定于可穿戴设备的功能。
通知结构
通知的设计由系统模板决定,您的应用定义模板每个部分的内容。通知的一些详细信息仅在展开视图中显示。
通知最常见的部件如图 7 所示,如下所示
- 小图标:必需;使用
setSmallIcon()
设置。 - 应用名称:由系统提供。
- 时间戳:由系统提供,但您可以使用
setWhen()
覆盖它或使用setShowWhen(false)
隐藏它。 - 大图标:可选;通常仅用于联系人照片。不要将其用于您的应用图标。使用
setLargeIcon()
设置。 - 标题:可选;使用
setContentTitle()
设置。 - 文本:可选;使用
setContentText()
设置。
我们强烈建议使用系统模板,以便在所有设备上实现正确的设计兼容性。如有必要,您可以创建自定义通知布局。
有关如何使用这些功能创建通知的更多信息,请阅读创建通知。
通知操作
虽然不是必需的,但对于每个通知来说,在点击时打开相应的应用活动都是一个好习惯。除了此默认通知操作外,您还可以添加操作按钮,以从通知中完成与应用相关的任务——通常无需打开活动——如图 8 所示。
从 Android 7.0(API 级别 24)开始,您可以添加操作以直接回复消息或从通知中输入其他文本。
从 Android 10(API 级别 29)开始,平台可以自动生成带有建议的基于意图的操作的操作按钮。
在创建通知中进一步解释了添加操作按钮。
需要解锁设备
用户可能会在设备的锁定屏幕上看到通知操作。如果通知操作导致应用启动活动或发送直接回复,则用户必须先解锁设备,然后应用才能调用该通知操作。
在 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 所示。
您还可以使用图像、收件箱样式、聊天对话或媒体播放控件创建可扩展通知。有关更多信息,请阅读创建可扩展通知。
通知更新和组
为了避免在您有其他更新时向用户发送多个或冗余的通知,请更新现有通知,而不是发出新通知,或者使用收件箱样式通知来显示对话更新。
但是,如果需要发送多个通知,请考虑将单独的通知组合到一个组中,该组在 Android 7.0 及更高版本中可用。
通知组允许您将多个通知折叠到通知抽屉中的一个帖子中,并显示摘要。用户可以逐步展开通知组及其中的每个通知以获取更多详细信息,如图 10 所示。
要了解如何将通知添加到组中,请参阅创建通知组。
通知渠道
从 Android 8.0(API 级别 26)开始,所有通知都必须分配到一个渠道,否则它们将不会显示。这允许用户禁用应用的特定通知渠道,而不是禁用所有通知。用户可以从 Android 系统设置中控制每个渠道的视觉和听觉选项,如图 11 所示。用户还可以长按通知以更改关联渠道的行为。
在运行 Android 7.1(API 级别 25)及更低版本的设备上,用户只能按应用管理通知。每个应用在 Android 7.1 及更低版本上实际上只有一个渠道。
一个应用可以为应用发出的每种类型的通知设置单独的渠道。应用还可以根据用户做出的选择创建通知渠道。例如,您可以在消息应用中为用户创建的每个对话组设置单独的通知渠道。
渠道也是您在 Android 8.0 及更高版本上指定通知重要性级别的地方,因此发布到同一通知渠道的所有通知都具有相同行为。这将在下一节中介绍。
有关更多信息,请参阅创建和管理通知渠道。
通知重要性
Android 使用通知的重要性来确定通知在视觉和听觉上中断用户的程度。通知的重要性越高,中断性就越大。
在 Android 7.1(API 级别 25)及更低版本中,通知的重要性由通知的priority
决定。
在 Android 8.0(API 级别 26)及更高版本中,通知的重要性由通知发布到的渠道的importance
决定。用户可以在系统设置中更改通知渠道的重要性,如图 12 所示。
可能的重要级别和关联的通知行为如下:
紧急:发出声音并显示为悬浮通知。
高:发出声音。
中:不发出声音。
低:不发出声音,也不会出现在状态栏中。
所有通知,无论其重要性如何,都会出现在非中断系统 UI 位置,例如通知抽屉和启动器图标上的徽章。但是,您可以修改通知徽章的外观。
有关更多信息,请阅读有关如何设置重要性。
请勿打扰模式
从 Android 5.0(API 级别 21)开始,用户可以启用请勿打扰模式,该模式会使所有通知的铃声和振动静音。通知仍会照常显示在系统 UI 中,除非用户另有指定。
请勿打扰模式下有三个可用级别:
- 完全静音:阻止所有声音和振动,包括闹钟、音乐、视频和游戏发出的声音和振动。
- 仅闹钟:阻止所有声音和振动,但闹钟除外。
- 仅优先级:用户可以配置哪些系统级类别可以中断他们,例如仅闹钟、提醒、事件、呼叫或消息。对于消息和呼叫,用户可以根据发送者或呼叫者进行筛选,如图 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
通知。当手机已锁定或用户选择全部清除时,此功能也不适用。