通知是 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 设备,您的所有通知都会自动显示在已配对的 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
通知。当手机处于锁定状态或选择全部清除时,上述情况也不适用。