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

[TOC]

一、什么是通知Notification?

Notification翻译过来就是:

Android系统中的Notification

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

样式如下:


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

Android中通知Notification的组成

  • 主要内容:这是通知中最突出的元素。次要信息(例如时间戳)较小并合并在主要内容之上。
  • 人物:如果通知涉及人物,则头像会从其余内容中脱颖而出。
  • 操作:用户可以通过点击指示器图标来展开通知。操作以单独的背景颜色和位置上的文本标签显示。
    折叠通知

通知的标题和内容

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


通知标头区域

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

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

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

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

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

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

通知的操作
  • 1文本按钮操作

  • 2填充操作按钮

  • 3建议回复

  • 4回复文本字段

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

扩展视图

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

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

  • 建议回复
  • 强调动作(药丸状按钮)
  • 标准文本操作


    错误示例:包括复制点击通知正文行为的文本操作。
正确示例:让用户有机会与通知进行交互。Google Clock应用程序显示计时器正在运行,但它允许用户直接从通知中暂停或添加一分钟。

可输入回复的通知

可输入回复的通知

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

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

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

二、通知Notification的作用

  • 考虑通知的目的:为什么要提醒用户?提高用户粘性?还是为了有重要的消息通知到用户?促销?。。。why?
  • 确定通知权限模式,考虑通知对您的应用程序的重要性以及在用户使用过程中的何处询问。
  • 选择合适的通知模板样式。
  • 创建通知:

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

  • 通过使用文本按钮、打字或媒体控件根据用户的内容提供操作,让用户清楚地了解用户可以使用通知执行哪些操作。
  • 包含您的应用程序图标并设置应用程序图标背景颜色。
  • 设置通知的渠道和类别。这允许系统和您的用户自定义他们接收的通知并提供优先级。
  • 如果您的应用程序可能会同时发送多个通知,请对通知进行分组。

三、通知Notification的类型和样式

标准模板

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


标准模板

大文本模板

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


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

大图片模板

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


大图片模板

进度模板

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


进度模板

媒体模板

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

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

媒体模板

消息模板

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

消息模板

调用模板

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

image.png

四、通知Notification的行为和处理

通知到达

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

  • 发出声音或引起手机振动。

  • 在状态栏中以图标显示;这通常是您的应用程序图标,但如果您有多种类型的通知,请使用能够捕获通知用途的符号。

  • 显示为平视通知,查看当前屏幕以吸引用户的注意力。
    与往常一样,用户可以选择更改您设置的通知行为。


    通知到达
  • 1状态栏中的通知指示器,指示通知抽屉中有通知。

  • 2通知“窥视”当前屏幕以在任务过程中吸引用户的注意力。

通知抽屉

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

  • 应用程序声明的通知优先级或重要性
    通知最近是否通过声音或振动提醒用户
    通知中附加的任何人员以及他们是否是已加星标的联系人
    通知是否代表正在进行的重要活动,例如正在进行的通话或音乐播放
    通过添加强调或取消强调,Android 操作系统更改了列表顶部和底部的某些通知的外观,这有助于用户扫描内容

处理过时的通知

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


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

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


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

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

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

  • 导航到目的地:要进行导航,用户可以点击通知。如果通知显示在锁定屏幕上,用户需要双击它,然后输入 PIN、图案或密码。当用户点击通知时,您的应用程序必须显示与该通知直接相关的 UI,并让用户立即采取操作。例如,如果通知显示轮到他们参加两人游戏,则点击通知应将他们直接带到该游戏。

  • 查看通知的展开视图:标题中出现展开指示符。用户可以点击指示器或向下滑动通知正文以将其展开。


    扩展通知
  • 关闭通知(如果允许):用户可以通过向左或向右滑动来关闭它。

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

  • 暂停平视通知:用户可以向上滑动平视通知,并且不允许该事件的进一步通知在一分钟内闪烁。

  • 控制将来的类似通知:用户可以通过以下方式访问通知控件:

    • 触摸并按住单个通知
    • 向左或向右滑动通知,然后点击设置图标

将多个通知分组

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

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

  • 父通知显示其子通知的摘要。
  • 如果用户展开父通知,Android 将显示所有子通知。
  • 用户可以展开子通知以显示其全部内容。
    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 和照片应用程序的锁定屏幕通知会在用户选择在锁定屏幕上显示此信息后显示所有内容。


具有不同灵敏度级别的锁定屏幕。
  • 1锁屏显示所有通知内容

  • 2锁屏隐藏敏感通知内容

七、通知的样式建议

文字清晰简洁

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

  • 不超过30个字符
  • 包含最重要的信息
  • 避免变量(除非它们包含数字或短文本字符串,或者前面有文本)
  • 排除已经出现在标题中的应用程序名称

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

  • 避免超过 40 个字符的限制
  • 避免重复内容标题中的内容
在内容标题中显示应用程序名称,这与标题区域是多余的,并使用可用的字符。
在内容标题中显示最重要的信息。

大图标

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

  • 来自另一个人的通信,例如某人发送消息的图像
  • 内容来源(如果与发送通知的应用程序不同),例如用户订阅的 YouTube 频道的徽标
  • 有关通知的有意义的符号,例如表示行车路线的箭头符号
    大图标在显示人物时必须是圆形的,但在所有其他情况下必须是方形的。


    使用大图标进行品牌推广。
使用大图标以有意义的方式强化通知的内容,例如在消息通知中附加显示人员的照片。
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 或更高版本。

用户滑离对话框

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

对新安装的应用的影响

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

  • 如果您的应用以 Android 13 或更高版本为目标平台,应用将可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。
  • 如果您的应用以 12L(API 级别 32)或更低版本为目标平台,在您创建通知渠道后您的应用首次启动 activity 时,或在您的应用启动一个 activity,然后创建它的第一个通知渠道时,系统会显示该权限对话框。这通常是在应用启动时。

对现有应用更新的影响

为了最大限度地减少与通知权限相关的中断,当用户将其设备升级到 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) 命令,您可以模拟最常见的用户选择和设备升级顺序,而无需重置测试设备:

  • 应用新安装在搭载 Android 13 或更高版本的设备上:
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
  • 当应用安装在搭载 Android 12L 或更低版本的设备上时,用户让通知保持启用状态,然后设备升级到 Android 13 或更高版本:
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
  • 当应用安装在搭载 Android 12L 或更低版本的设备上时,用户手动停用通知,然后设备升级到 Android 13 或更高版本:
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的变更与适配

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容