通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或应用中的其他及时信息。用户可以点按通知来打开应用,或直接从通知中执行操作。
此页面将概述通知的显示位置和可用功能。如要开始构建通知,请阅读创建通知。
如需了解有关设计和交互模式的更多信息,请参阅通知设计指南。此外,请参阅 Android 通知示例,了解在移动应用和穿戴式设备应用中使用 Notification.Style
API 的最佳实践演示。
在设备上的外观
通知会在不同位置以不同格式显示在用户面前,例如状态栏中的图标、抽屉式通知栏中的详情条目、应用图标上的标志,以及在配对的穿戴式设备上自动显示。
状态栏与抽屉式通知栏
发出通知后,通知先以图标的形式在状态栏中显示。
图 1. 通知图标在状态栏的左侧显示
用户可以在状态栏上向下滑动以打开抽屉式通知栏,然后便可在其中查看更多详细信息并对通知执行操作。
图 2. 抽屉式通知栏中的通知
用户可以向下拖动抽屉式导航栏中的通知以显示展开视图,该视图会展示更多内容和操作按钮(如果提供)。
通知会在抽屉式通知栏中保持可见状态,直至应用或用户将其关闭。
浮动通知
从 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 展示了通知最常见的部分,具体如下所示:
小图标:此为必要图标,通过 setSmallIcon()
设置。
应用名称:此由系统提供。
时间戳:此由系统提供,不过您可以通过 setWhen()
进行替换,或使用 setShowWhen(false)
将其隐藏。
大图标:此为可选图标(通常仅用于联系人照片;请勿将其用于应用图标),通过 setLargeIcon()
设置。
标题:此为可选内容,通过 setContentTitle()
设置。
文本:此为可选内容,通过 setContentText()
设置。
如需详细了解如何使用上述及更多功能创建通知,请参阅创建通知。
通知操作
虽然并非强制要求,但每个通知都应在用户点按时打开相应的应用 Activity。除了此默认通知操作外,您还可以添加操作按钮,以完成通知中与应用相关的任务(通常不必打开 Activity),如图 9 所示。
图 9. 包含操作按钮的通知
从 Android 7.0(API 级别 24)开始,您可以添加操作来回复消息,或者直接从通知中输入其他文本。
从 Android 10(API 级别 29)开始,平台可以自动生成操作按钮,此类按钮包含基于 Intent 的建议操作。
创建通知对添加操作按钮做了进一步说明。
展开式通知
默认情况下,为了满足仅显示一行的要求,通知的文本内容会被截断。如果您希望显示的通知内容更长,则可以通过应用其他模板来启用更大的展开式文本区域,如图 8 所示。
图 8. 适用于大型文本的展开式通知
您还可以使用图像、收件箱样式、聊天对话或媒体播放控件来创建展开式通知。如需了解详细信息,请参阅创建展开式通知。
尽管我们建议您始终使用这些模板来确保设计在所有设备上的兼容性,但如有必要,您也可以创建自定义通知布局。
通知更新与分组
如要避免在有额外更新时以多个或冗余通知来打扰用户,您应该考虑更新现有通知而不是发布新通知,或者考虑使用收件箱式通知来显示会话更新。
但是,如果有必要传递多个通知,则应考虑将这些独立通知分为一组(适用于 Android 7.0 及更高版本)。借助通知组,您能够以摘要形式将多个通知收起到抽屉式通知栏的一条通知消息中。然后,用户可以展开通知以查看每个单独通知的详细信息。
用户可以逐级展开通知组及其中的每个通知,以获取更多详细信息。
图 10.收起和展开的通知组
如要了解如何向通知组添加通知,请参阅创建通知组。
注意:如果同一应用发送四个或更多通知,但未指定分组,则系统会自动将它们分为一组。
通知渠道
从 Android 8.0(API 级别 26)开始,所有通知都必须分到一个渠道,否则通知将不会显示。通过将通知分类到渠道,用户可以停用应用的特定通知渠道(而不是停用所有通知),还可以控制每个渠道的视觉和听觉选项,所有这些操作都在 Android 系统设置中完成(如图 11 所示)。用户还可以长按通知以更改关联渠道的行为。
在运行 Android 7.1(API 级别 25)及更低版本的设备上,用户可以仅按应用来管理通知(实际上,每个应用在 Android 7.1 或更低版本中仅有一个渠道)。
图 11.时钟应用及其某个渠道的通知设置
注意:界面将渠道称为“类别”。
一个应用可以有多个通知渠道,应用发出的每种通知类型都对应一个单独的渠道。应用还可以创建通知渠道,以响应应用用户的选择。例如,您可以为用户在消息应用中创建的每个会话组设置单独的通知渠道。
您还可以在该渠道中为 Android 8.0 及更高版本上的通知指定重要性级别。因此,发布到同一通知渠道的所有通知都具有相同的行为。
如需了解详细信息,请参阅创建和管理通知渠道。
通知的重要性
Android 使用通知的重要性来决定该通知应在多大程度上(视觉和听觉上)打扰用户。通知的重要性越高,通知的打扰级别就越高。
在 Android 8.0(API 级别 26)及更高版本上,通知的重要性由通知目标发布渠道的 importance
决定。用户可以在系统设置中更改通知渠道的重要性(图 12)。在 Android 7.1(API 级别 25)及更低版本上,各通知的重要性由通知的 priority
决定。
图 12.在 Android 8.0 及更高版本上,用户可以更改每个渠道的重要性
可能的重要性级别如下:
- 紧急:发出声音并以浮动通知的形式显示。
- 高:发出声音。
- 中:不发出声音。
- 低:不发出声音,也不在状态栏中显示。
无论重要性如何,所有通知都将在不间断的系统界面位置中显示,例如在抽屉式通知栏中显示,以及在启动器图标上作为标志显示(尽管您可以修改通知标志的外观)。
如需了解详细信息,请参阅如何设置重要性。
请勿打扰模式
从 Android 5.0(API 级别 21)开始,用户可以启用请勿打扰模式,以关闭所有通知的声音和振动。除非用户另行指定,否则通知仍会在系统界面中照常显示。
请勿打扰模式包含三种级别:
- 完全静音:屏蔽所有声音和振动,包括闹钟、音乐、视频和游戏的声音与振动。
- 仅限闹钟:屏蔽除闹钟外的所有声音和振动。
- 仅限优先事项:用户可以配置,在系统范围内,哪些类别可以打扰他们(例如仅限闹钟、提醒、活动、来电或消息等)。对于消息和来电,用户还可以根据发送者或来电者的身份进行过滤(图 13)。
图 13.用户可以根据系统范围的类别(左)和发送者或来电者的身份(右)来决定是否允许显示通知。
在 Android 8.0(API 级别 26)及更高版本上,用户可以按渠道替换“请勿打扰”,以额外允许显示应用特定类别(称为“渠道”)的通知。例如,支付应用可能具有与提款和存款相关的通知渠道。用户则可以选择允许显示提款通知、存款通知,或在优先级模式下允许显示这两种通知。在运行 Android 7.1(API 级别 25)及更低版本的设备上,用户可以按应用允许显示通知,而不是按渠道允许显示通知。
如要为这些用户设置正确配置通知,您必须设置系统范围的类别和渠道。
前台服务通知
如果您的应用正在运行“前台服务”(一种长时间在后台运行且用户可察觉到的 Service
,如媒体播放器),则需要发出通知。此通知不能像其他通知一样取消。如要移除通知,则必须停止服务或从“前台”状态中移除该服务。
如需了解更多信息,请参阅在前台运行服务。如果您要构建媒体播放器,还请参阅对前台服务使用 MediaStyle 通知。
发布限制
从 Android 8.1(API 级别 27)开始,应用每秒发出的通知声音不得超过一次。如果应用在一秒钟内发布多个通知,则这些通知会按预期显示,但是在每秒中只有第一个通知会发出声音。
不过,Android 还对更新通知的频率作了限制。如果对单个通知发布更新的频率过高(一秒内发布多个更新),则系统可能会删除一些更新。
通知兼容性
从 Android 1.0 开始,通知系统界面和与通知相关的 API 就在不断发展。如要在继续支持旧版设备的同时使用最新的通知 API 功能,请使用支持库通知 API:NotificationCompat
及其子类,以及 NotificationManagerCompat
。这样一来,您就无需编写条件代码来检查 API 级别,因为这些 API 会为您代劳。
NotificationCompat
会随着平台发展而更新,以便加入最新方法。需要注意的是,某个方法在 NotificationCompat
中可用并不能保证其会在旧版设备上提供相应功能。在某些情况下,调用新引入的 API 会导致旧版设备出现空操作。例如,NotificationCompat.addAction()
仅在运行 Android 4.1(API 级别 16)及更高版本的设备上显示操作按钮。
以下是最明显的 Android 通知行为变化的摘要。
Android 4.1(API 级别 16)
- 引入了展开式通知模板(称为通知样式),可以提供较大的通知内容区域来显示信息。用户可以使用单指向上/向下滑动的手势来展开通知。
- 还支持以按钮形式向通知添加其他操作。
- 允许用户在设置中按应用关闭通知。
Android 4.4(API 级别 19 和 20)
- 向 API 中添加了通知侦听器服务
- API 级别 20 中添加了对 Android Wear(现称为 Wear OS)的支持。
Android 5.0(API 级别 21)
- 引入了锁定屏幕和浮动通知。
- 用户现在可以将手机设置为“请勿打扰”模式,并配置当设备处于“仅限优先事项”模式时,哪些通知可以打扰他们。
- 向 API 集添加了通知是否在锁定屏幕上显示的方法 (
setVisibility()
),以及指定通知文本的“公开”版本的方法。 - 添加了
setPriority()
方法,告知系统该通知应具有的“干扰性”(例如,将其设置为“高”,可使该通知以浮动通知的形式显示)。 - Android Wear(现称为 Wear OS)设备添加了通知堆栈支持。使用
setGroup()
将通知放入堆栈。请注意,平板电脑和手机尚不支持通知堆栈。通知堆栈以后会称为组或 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()
。