推送

Android各个版本上的通知Notification(至And

2024-02-28  本文已影响0人  NeWolf

[TOC]

一、什么是通知Notification?

Notification翻译过来就是:

Android系统中的Notification

在Android系统中指 Android 在应用界面之外显示的消息,旨在向用户提供提醒、来自他人的通信或您的应用中的其他实时信息。用户可以点按通知以打开您的应用,也可以直接从通知中执行操作。

样式如下:


系统状态栏的通知 锁屏的通知

Android中通知Notification的组成

通知的标题和内容

折叠时,通知会显示应用程序图标、标题文本、时间戳、展开指示器和内容文本。它还可以选择显示一个大图标。


通知标头区域

1 应用程序图标:应用程序图标是应用程序身份的二维表示。它以单色显示在状态栏中。如果您的应用程序发送多种通知,请考虑将应用程序图标替换为符号以区分不同类型的通知。有关详细信息,请参阅应用图标颜色此为必要图标,通过 setSmallIcon() 设置。

2 标题文本:通知或来源的简短标题,例如用户的帐户名称。内容是通知中最突出的元素。由系统提供。

3 时间戳:指示发送通知的时间,例如未接来电的时间。由系统提供。

4 展开指示器:指示通知处于折叠状态还是展开状态。

5 内容文本:支持信息。此为可选内容,通过 setContentText() 设置。

6 大图标(可选):可以添加图像以有意义的方式强化通知,例如包含发件人头像的消息。通过 setLargeIcon() 设置

通知的操作

从 Android 7.0(API 级别 24)开始,系统显示不带图标的操作以容纳更多文本。为了适应 Android Wear 设备以及运行 Android 6.0(API 级别 23)及更低版本的设备,您的应用程序仍必须提供应用图标。

扩展视图

可以使用扩展视图向用户显示更多信息,而无需离开通知。

展开后,通知最多可以提供以下任意操作中的三种:

正确示例:让用户有机会与通知进行交互。Google Clock应用程序显示计时器正在运行,但它允许用户直接从通知中暂停或添加一分钟。

可输入回复的通知

可输入回复的通知

可以通过包含回复操作来让用户直接在通知中键入内容。这是专为输入少量文本而设计的,例如回复短信或记下简短的笔记。

对于较长格式的输入,请将用户导航到您的应用程序,为他们提供更多空间来查看和编辑文本。

对于消息传递应用程序,我们建议在用户发送回复后保留通知,并等到对话暂停后再自动关闭通知。

二、通知Notification的作用

1.标题文本应简洁地总结通知。
2.内容文本应预览通知。
3.图片(可选内容)。
4.媒体模板的媒体关键艺术和元数据。(例如音乐播放)

三、通知Notification的类型和样式

标准模板

标准模板适用于大多数通知,允许简洁的文本、大图标(如果适用)和操作。


标准模板

大文本模板

大文本模板非常适合显示较长的文本块。它允许用户在展开通知后预览更多文本。


大文本模板,带有选项大图标

大图片模板

大图片模板专为包含图像的通知而设计。折叠时,通知会显示图片的大图标缩略图。展开后,通知会显示更大的预览。


大图片模板

进度模板

进度模板专为用户发起的需要时间才能完成的活动而设计。展开时,使用此模板的通知会显示进度条,并且还包括允许用户终止此活动的“取消”操作。(不可取消的活动不需要通知。)


进度模板

媒体模板

媒体模板旨在让用户控制当前从应用程序播放的媒体。
折叠时,通知最多可以显示三个操作。大图标可以显示相关图像,例如专辑封面。
展开后,通知将显示最多五个带有较大图像的操作,或六个没有图像的操作。通知的背景和其他元素自动继承图像的颜色。

注意:要使您的播放器应用程序出现在快速设置区域中,请使用有效的 MediaSession 令牌创建 MediaStyle 通知。有关详细信息,请参阅媒体控件

媒体模板

消息模板

MessagingStyle模板专为实时通信而设计。展开后,使用此模板的通知允许用户从通知内回复消息。

消息模板

调用模板

使用CallStyle模板生成大格式通知,其中包括大图像附件并指示传入或传出呼叫。

image.png

四、通知Notification的行为和处理

通知到达

当通知到达时,Android 将其添加到通知抽屉中。根据您设置的参数和设备的当前状态,通知可能会执行以下任一操作:

通知抽屉

Android 中的通知抽屉通常按时间倒序显示通知,并受以下条件影响进行调整:

处理过时的通知

通知抽屉旨在向用户显示与当前时刻相关的信息。如果较早的通知已过时(即不再相关),请将其忽略,以便用户看不到它。


刚刚到达的文本显示在通知抽屉的顶部,有关添加照片的优先级较低的通知显示在底部

在运行 Android 8.0(API 级别 26)及更高版本的设备上受支持的启动器中,应用程序图标会显示一个通知点,以指示该应用程序有与之关联的新通知。这些点默认出现在支持它们的启动器应用程序中,并且您的应用程序不需要执行任何操作。启动图标上的小红点也可以被禁用和限制。


应用程序图标上的通知点,表示该应用程序有一个与之关联的新通知

由应用程序启动图标显示的新通知

通知可以使用户执行以下任意操作:

指示后台持续进程(例如音乐播放)的持续通知可能无法通过滑动来消除。

将多个通知分组

对于生成多个相同类型通知的应用程序,Android 提供通知分组以避免用户不知所措。

您的应用程序可以根据以下层次结构呈现多个通知。

如果子通知单独出现,则必须易于理解,因为当它们到达时,系统可能会将它们显示在组之外。

分组通知折叠和展开视图。

五、通知的设置

渠道

从 Android 8.0(API 级别 26)开始,所有通知都必须分配给一个通道。对于每个通道,您可以设置应用于该通道中所有通知的视觉和听觉行为。用户可以更改这些设置并决定应用程序中的哪些通知渠道可以是侵入性的或可见的。


时钟应用程序及其通道之一的通知设置。

注意:用户界面将通知渠道称为“类别”。

创建通知通道后,您将无法更改通知行为。此时用户拥有完全控制权。但是,您仍然可以更改频道的名称和描述。
为您需要发送的每种类型的通知创建一个通道。您还可以创建通知渠道来反映用户所做的选择。例如,您可以为用户在消息应用程序中创建的每个对话组设置单独的通知渠道。

注意:如果您以 Android 8.0(API 级别 26)或更高版本为目标并在未指定通知渠道的情况下发布通知,则不会显示通知,并且系统会记录错误。

当您以 Android 8.0(API 级别 26)或更高版本为目标时,您必须实现一个或多个通知渠道。如果targetSdkVersion设置为 25 或更低,则当您的应用在 Android 8.0(API 级别 26)或更高版本上运行时,其行为与运行 Android 7.1(API 级别 25)或更低版本的设备上的行为相同。

注意:从 Android 8.0(API 级别 26)开始,您可以在开发设备上打开一项设置,以在针对 Android 8.0(API 级别 26)或更高版本的应用尝试发布消息时显示屏幕警告,该警告显示为 Toast没有通知渠道。要打开运行 Android 8.0(API 级别 26)或更高版本的开发设备的设置,请导航至设置>开发人员选项并启用 显示通知通道警告

创建通知通道

  1. 构造一个 NotificationChannel具有唯一通道 ID、用户可见名称和重要性级别的对象。

选择重要性时应考虑用户的时间和注意力。当不重要的通知被伪装成紧急时,可能会产生不必要的警报。

  1. (可选)指定用户在系统设置中看到的描述 setDescription()

  2. 通过将通知通道传递给 来注册通知通道 createNotificationChannel()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the NotificationChannel.
    val name = getString(R.string.channel_name)
    val descriptionText = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    // Register the channel with the system. You can't change the importance
    // or other notification behaviors after this.
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}

使用原始值重新创建现有通知通道不会执行任何操作,因此在启动应用程序时调用此代码是安全的。

默认情况下,发布到给定通道的所有通知都使用由类的重要性级别定义的视觉和听觉行为 NotificationManagerCompat ,例如 IMPORTANCE_DEFAULTIMPORTANCE_HIGH有关重要性级别的详细信息,请参阅下一节 。

如果您想进一步自定义频道的默认通知行为,您可以 在 上调用enableLights()setLightColor()、 和 等 方法。请记住,一旦创建了频道,就无法更改这些设置,并且用户对这些行为是否处于活动状态拥有最终控制权。setVibrationPattern()NotificationChannel

您还可以通过调用在单个操作中创建多个通知通道 createNotificationChannels()

注意:除了将每个通知添加到特定于应用程序的渠道之外,还可以考虑将每个通知添加到 系统范围的类别之一,例如 CATEGORY_ALARMCATEGORY_REMINDER

设置重要性级别

用户可见的重要性级别 重要性(Android 8.0 及更高版本) 优先级(Android 7.1 及更低版本)
紧急发出声音并显示为平视通知。 IMPORTANCE_HIGH PRIORITY_HIGH或者PRIORITY_MAX
发出声音。 IMPORTANCE_DEFAULT PRIORITY_DEFAULT
不发出声音。 IMPORTANCE_LOW PRIORITY_LOW
不发出声音并且不会出现在状态栏中。 IMPORTANCE_MIN PRIORITY_MIN
不发出声音,并且不会出现在状态栏或阴影中。 IMPORTANCE_NONE N/A

所有通知,无论重要性如何,都会显示在不间断的系统 UI 位置,例如通知抽屉中以及作为 启动器图标上的徽章,尽管您可以 修改通知徽章的外观

一旦您将频道提交到 NotificationManager,您就无法更改重要性级别。但是,用户可以随时更改他们对应用频道的偏好。

有关选择适当优先级的信息,请参阅 通知设计指南中的“优先级” 。

读取通知通道设置

用户可以修改通知渠道的设置,包括振动和警报声音等行为。如果您想了解用户应用于您的通知渠道的设置,请按照以下步骤操作:

  1. NotificationChannel通过调用 getNotificationChannel() 或 获取对象getNotificationChannels()

  2. 查询具体通道设置,如 getVibrationPattern()getSound()、 、 getImportance()

如果您检测到您认为某个频道设置会抑制应用程序的预期行为,您可以建议用户更改它并提供打开频道设置的操作,如下一节所示。

打开通知通道设置

创建通知通道后,您无法以编程方式更改通知通道的视觉和听觉行为。只有用户可以从系统设置更改通道行为。为了让您的用户能够轻松访问这些通知设置,请在应用程序的 设置 UI中添加一个可打开这些系统设置的项目。

Intent您可以使用使用该 操作的 来打开通知渠道的系统设置 ACTION_CHANNEL_NOTIFICATION_SETTINGS

例如,以下示例代码显示如何将用户重定向到通知通道的设置:

val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)

请注意,意图需要两个额外的内容来指定应用程序的包名称(也称为应用程序 ID)和要编辑的通道。

删除通知渠道

您可以通过调用 来删除通知渠道 deleteNotificationChannel()。以下示例代码演示了如何完成此过程:

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)

注意:通知设置屏幕显示已删除频道的数量,作为垃圾邮件预防机制。您可以通过重新安装应用程序或清除与应用程序副本关联的数据来清除开发设备上的测试通道。

创建通知通道组

如果想要在设置 UI 中进一步组织频道的外观,您可以创建频道组。当您的应用程序支持多个用户帐户(例如 工作配置文件)时,这是一个好主意,因为它允许您为每个帐户创建一个通知渠道组。这样,用户可以轻松识别和控制具有相同名称的多个通知通道。

带有个人和工作帐户组的通知通道设置。

例如,社交网络应用程序可能包括对个人和工作帐户的支持。在这种情况下,每个帐户可能需要多个具有相同功能和名称的通知通道,如下所示:

一个个人账户有两个渠道:

具有两个渠道的企业帐户:

将每个帐户的通知渠道分组可以让用户区分它们。

每个通知通道组都需要一个 ID(该 ID 在您的包中必须是唯一的)以及用户可见的名称。以下代码片段演示了如何创建通知通道组。

// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))

创建新组后,您可以调用 setGroup() 将新NotificationChannel对象与该组关联。

将通道提交给通知管理器后,您将无法更改通知通道和组之间的关联。


Googol 日历的通知 Facebook的通知设置 Facebook分组中的-加好友请求通知

预定义渠道类型

无论您是否使用渠道,都可以将每个单独的通知分配到最合适的预定义类别。Android 可能会使用此信息来做出排名和过滤决策。

类别 描述
CATEGORY_CALL 来电(语音或视频)或类似的同步通信请求
CATEGORY_MESSAGE 传入的直接消息(短信、即时消息等)
CATEGORY_EMAIL 异步批量消息(电子邮件)
CATEGORY_EVENT 日历事件
CATEGORY_PROMO 促销或广告
CATEGORY_ALARM 闹钟或定时器
CATEGORY_PROGRESS 长时间运行的后台操作的进度
CATEGORY_SOCIAL 社交网络或分享更新
CATEGORY_ERROR 后台操作或认证状态错误
CATEGORY_TRANSPORT 用于播放的媒体传输控制
CATEGORY_SYSTEM 系统或设备状态更新。保留供系统使用。
CATEGORY_SERVICE 后台服务运行指示
CATEGORY_RECOMMENDATION 对单一事物的具体、及时的建议。例如,新闻应用程序可能会推荐用户接下来可能想阅读的新闻报道。
CATEGORY_STATUS 有关设备或上下文状态的持续信息

六、锁屏通知

如果用户选择在屏幕锁定时显示通知,这些通知可以隐藏您的应用标记为敏感的任何内容。Android 会评估每个通知的可见性级别,以确定可以安全显示的内容。

设置锁定屏幕上内容的敏感度级别

用户隐私至关重要,因此请注意,锁定屏幕上可以看到不同级别的通知。对于您创建的每个通知,您必须将可见性级别设置为publicprivateSecret

Level 场景
public 公共通知在安全锁定屏幕上完全可见。
private 秘密通知被隐藏敏感内容。
Secret 不会展示

私人通知位于中间:它们仅显示基本信息,包括发布它的应用程序的名称及其图标。您可以选择显示不泄露个人信息的文本,例如 ,而不是隐藏的常规内容2 new messages。

在以下示例中,Gmail 和照片应用程序的锁定屏幕通知会在用户选择在锁定屏幕上显示此信息后显示所有内容。


具有不同灵敏度级别的锁定屏幕。

七、通知的样式建议

文字清晰简洁

Android 将内容标题截断为一行(即使在展开时)。
一个好的内容标题遵循以下准则:

好的内容文本遵循以下准则:

在内容标题中显示应用程序名称,这与标题区域是多余的,并使用可用的字符。 在内容标题中显示最重要的信息。

大图标

对于图像能够有效强化通知内容的用例,请使用大图标。一些例子是:

使用大图标以有意义的方式强化通知的内容,例如在消息通知中附加显示人员的照片。 Facebook的好友推荐

八、通知运行时权限

Android 13(API 级别 33)及更高 版本支持从应用 发送 非豁免POST_NOTIFICATIONS(包括前台服务 (FGS))通知的运行时权限: 。此更改可帮助用户专注于对他们来说最重要的通知。

如果继续以 12L(API 级别 32)或更低为目标,则在应用程序功能的上下文中请求权限时会失去一些灵活性。

注意:应用程序不需要请求POST_NOTIFICATIONS权限即可启动前台服务。但是,应用程序在启动前台服务时必须包含通知,就像在以前版本的 Android 上一样。

权限声明

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

应用程序功能取决于用户在权限对话框中的选择

在此对话框中,用户可以执行以下操作:

以下部分根据用户执行的操作描述您的应用程序的行为方式。

用户选择“允许”

如果用户选择允许选项,您的应用程序可以执行以下操作:

用户选择“不允许”

如果用户选择不允许选项,您的应用将无法发送通知,除非它符合豁免条件。除少数特定角色外,所有通知渠道均被阻止。这类似于用户在系统设置中手动关闭应用程序的所有通知时发生的行为。

注意:如果您的应用程序以 12L 或更低版本为目标,并且用户点击“不允许”,即使只点击一次,也不会再次提示他们,直到发生以下情况之一:

用户滑离对话框

如果用户从对话框上滑开(即,他们没有选择 允许或不允许),则通知权限的状态不会更改。

对新安装的应用的影响

如果用户在搭载 Android 13 或更高版本的设备上安装您的应用,应用的通知默认处于关闭状态。在您请求新权限且用户向您的应用授予该权限之前,您的应用必须等待系统发送通知。
权限对话框的显示时间取决于应用的目标 SDK 版本:

对现有应用更新的影响

为了最大限度地减少与通知权限相关的中断,当用户将其设备升级到 Android 13 或更高版本后,系统会自动向所有符合条件的应用预先授予相应权限。换言之,这些应用可以继续向用户发送通知,而用户不会看到运行时权限提示。

注意:请考虑下面这种情形,即符合条件的应用安装在搭载 12L 或更低版本的旧设备上,用户在该设备上允许接收通知,但想淘汰该设备。用户现在有了搭载 Android 13 或更高版本的新设备,并通过备份和恢复功能恢复了应用。
在这种情况下,系统会将您的应用视为“现有应用”,因此系统会自动向您的应用授予相应权限,以便您的应用可以继续发送通知。

预先授予权限的资格条件

您的应用要获得自动预先授权必须满足以下条件:应用必须已具有通知渠道,并且用户未在搭载 12L 或更低版本的设备上明确停用应用的通知。

如果用户在搭载 12L 或更低版本的设备上停用了应用的通知,当设备升级到 Android 13 或更高版本后,该停用会继续有效。

豁免

此部分列出了一些不受通知权限行为变更影响的通知和应用。在 Android 13(API 级别 33)或更高版本中,如果用户拒绝授予通知权限,他们仍会在任务管理器中看到与前台服务相关的通知,但在抽屉式通知栏中看不到这些通知。

媒体会话

媒体会话有关的通知不受此行为变更的影响。

配置为自行管理通话的应用

如果您将应用配置为自行管理通话,那么您无需 POST_NOTIFICATIONS 权限即可让应用发送使用 Notification.CallStyle 通知样式的通知。

如果您的应用执行以下每项操作,系统就会认为您的应用已将自己配置为自行管理通话:

  1. 声明 MANAGE_OWN_CALLS 权限。
  2. 实现 ConnectionService 接口。
  3. 通过调用 registerPhoneAccount() 向设备的电信服务提供商注册。

测试应用

可以评估以下因素:当您的应用在搭载 Android 13 或更高版本的设备上首次使用时,通知权限对此应用有何影响。利用下面这组 Android 调试桥 (ADB) 命令,您可以模拟最常见的用户选择和设备升级顺序,而无需重置测试设备:

adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm clear-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-fixed
adb shell pm grant PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm set-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-fixed
adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm set-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
  android.permission.POST_NOTIFICATIONS user-fixed

最佳实践

更新应用的目标 SDK 版本

为了让应用更灵活地显示权限对话框,请将应用更新为以 Android 13 或更高版本为目标平台。

等待一段时间再显示通知权限提示

等到用户熟悉您的应用之后,再请求他们授予任何权限。

新用户可能想要探索您的应用,并切身体会每项通知请求可以带来的好处。您可以通过用户操作触发权限提示。下面列举了几个适合显示通知权限提示的时机:

显示了请求通知权限的建议工作流程。除非 shouldShowRequestPermissionRationale() 返回 true,否则您的应用无需显示中间屏幕,即标题为“接收通知!”的屏幕。
或者,您可以设置一个请求,在用户有机会熟悉您的应用后显示该屏幕。例如,您可以等到用户第三次或第四次启动应用时再显示。

关于请求通知权限的建议用户驱动工作流程。仅当 shouldShowRequestPermissionRationale() 返回 true 时,才有必要显示中间屏幕。

在上下文中请求权限

在应用内请求通知权限时,请在正确的上下文中请求,以便用户明确了解通知的用途以及应该选择接收通知的原因。例如,电子邮件应用可能包含为每封新邮件发送通知的选项,或仅为用户是唯一收件人的邮件发送通知的选项。

借此机会明确向用户表明您的意图,有助于鼓励用户向您的应用授予通知权限。

检查您的应用能否发送通知

用户必须为您的应用启用通知,您的应用才能发送通知。要确认用户是否已启用通知,请调用 areNotificationsEnabled()

val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val isEnable = notificationManager.areNotificationsEnabled()

以负责任的方式使用权限

获得发送通知的许可后,请以负责任的方式使用该权限。用户可以查看您的应用每天发送的通知数量,并且可以随时撤消该权限

???、Android各个版本对通知Notification的变更与适配

上一篇下一篇

猜你喜欢

热点阅读