通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或应用中的其他实时信息。用户可以点按通知来打开应用,或直接从通知中执行操作。
本页将概要介绍通知的显示位置及可用功能。如需开始构建通知,请参阅创建通知。
如需详细了解通知设计和互动模式,请参阅通知设计指南。
在设备上的外观
通知会在不同位置以不同格式自动显示在用户面前。通知会以图标的形式显示在状态栏中,以详细条目的形式显示在抽屉式通知栏中,并以标志的形式显示在应用图标上。通知也会显示在已配对的穿戴式设备上。
状态栏和抽屉式通知栏
发出通知后,通知先以图标的形式在状态栏中显示。
用户可以在状态栏上向下滑动以打开抽屉式通知栏,然后便可在其中查看更多详细信息并对通知执行操作。
用户可以向下拖动抽屉式通知栏中的某条通知以查看展开后的视图,其中会显示更多内容以及操作按钮(如果有)。从 Android 13 开始,此展开后的视图会包含一个按钮,可让用户停止具有持续前台服务的应用。
在应用或用户关闭通知之前,通知会一直显示在抽屉式通知栏中。
提醒式通知
从 Android 5.0 开始,通知可以短暂地显示在浮动窗口中,称之为提醒式通知。此行为通常针对用户需要立即了解的重要通知,并且仅在设备解锁后才会出现。
浮动通知会在应用发出通知时显示。该通知会在片刻后消失,但仍像往常一样在抽屉式通知栏中保持可见状态。
可能会触发浮动通知的条件包括:
用户的 activity 处于全屏模式,例如当应用使用
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()
进行设置。
我们强烈建议您使用系统模板,以确保设计能够很好地兼容所有设备。如有必要,您可以创建自定义通知布局。
如需详细了解如何创建包含上述功能及其他功能的通知,请参阅创建通知。
通知操作
虽然并非强制要求,但最好让每个通知在被点按时打开相应的应用 activity。除了此默认通知操作外,您还可以添加操作按钮,以完成通知中与应用相关的任务(通常不必打开 activity),如图 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 所示。
您还可以使用图片、收件箱样式、聊天对话或媒体播放控件来创建展开式通知。如需了解详情,请参阅创建展开式通知。
通知更新和分组
为了使用户在您提供后续更新时不会遭遇多个通知或多余通知的轰炸,请更新现有通知(而不是发出新通知),或者使用收件箱样式的通知来显示会话更新。
不过,如果有必要传递多个通知,则应考虑将这些独立通知分为一组(适用于 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 所示。
可能的重要程度等级及其相关通知行为如下所示:
紧急:发出提示音,并以提醒式通知的形式显示。
高:发出提示音。
中:不发出提示音。
低:不发出提示音,且不会在状态栏中显示。
无论重要性如何,所有通知都会在不间断的系统界面位置显示,例如在抽屉式通知栏中显示,以及在启动器图标上作为标志显示。不过,您可以修改通知标记的外观。
如需了解详情,请参阅如何设置重要程度。
勿扰模式
从 Android 5.0(API 级别 21)开始,用户可以启用勿扰模式,以关闭所有通知的提示音和振动。除非用户另行指定,否则通知仍会在系统界面中照常显示。
勿扰模式包含 3 种级别:
- 完全静音:阻止所有提示音和振动(包括闹钟、音乐、视频和游戏)。
- 仅限闹钟:阻止所有提示音和振动,闹钟除外。
- 仅限优先事项:用户可以配置哪些系统级类别可以打扰他们(如仅限闹钟、提醒、活动、来电或短信等)。对于消息和来电,用户可以根据发送者或来电者进行过滤,如图 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)之前,平板电脑或手机不支持通知堆栈(后来称为组或 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()
。
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
通知。当手机处于锁定状态或用户选择清除全部时,此规则也不适用。