通知气泡可让用户更轻松地查看和参与对话。
气泡会浮动在其他应用内容之上,用户可以展开气泡来显示应用内容并与之互动,也可以在不使用时将其收起。
当设备处于锁定状态或熄屏显示处于启用状态时,气泡会像通知一样正常显示。
用户启用了通知气泡。为此,他们可以点按支持气泡的通知上的气泡按钮。这样,该特定对话便会始终以气泡形式显示。在设置中,用户可以调整他们已气泡化的聊天,或修改整个应用的设置。
用户可以执行以下操作:
- 屏蔽应用中的所有通知气泡。通知不会被屏蔽,但绝不会以气泡形式显示。
- 允许应用中的所选通知气泡。使用气泡按钮显示的通知即为“所选”通知。
- 允许应用中的所有通知气泡。使用
BubbleMetadata发送的所有通知都会显示为气泡。
通知气泡 API
通知气泡是使用通知 API 创建的。如果您希望通知以气泡形式显示,请为其附加额外数据。
气泡的展开视图是根据您选择的 activity 创建的。 将 activity 配置为以气泡形式正确显示。activity 必须可调整大小且可嵌入。如果缺少其中任何一项要求,系统会改为将其显示为通知。
以下代码演示了如何实现气泡:
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:resizeableActivity="true"
/>
如果您的应用显示多个相同类型的气泡(例如与不同联系人的多个聊天对话),该 activity 必须能够启动多个实例。在搭载 Android 10 及更低版本的设备上,除非您明确将 documentLaunchMode 设置为 "always",否则通知不会显示为气泡。从 Android 11 开始,您无需明确设置此值,因为系统会自动将所有对话的 documentLaunchMode 设置为 "always"。
如需发送通知气泡,请按以下步骤操作:
- 像往常一样创建通知。
- 调用
BubbleMetadata.Builder(PendingIntent, Icon)或BubbleMetadata.Builder(String)以创建BubbleMetadata对象。 - 使用
setBubbleMetadata()将元数据添加到通知中。 - 如果以 Android 11(API 级别 30)或更高版本为目标平台,请确保气泡元数据或通知引用了共享快捷方式。
- 修改应用,使其不取消以气泡形式显示的通知。 取消通知会从屏幕中移除气泡。打开气泡会自动隐藏与其关联的通知。
这些步骤如以下示例所示:
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* flags */) val category = "com.example.category.IMG_SHARE_TARGET" val chatPartner = Person.Builder() .setName("Chat partner") .setImportant(true) .build() // Create a sharing shortcut. val shortcutId = generateShortcutId() val shortcut = ShortcutInfoCompat.Builder(context, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel("Chat partner name") .build() // Publish the shortcut, otherwise the bubble metadata will not apply. ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) // Create a bubble metadata. val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, IconCompat.createWithResource(context, R.drawable.ic_logo)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.chat) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
如果发送气泡时您的应用在前台运行,系统会忽略重要程度,并始终显示您的气泡(除非用户屏蔽了来自您应用的气泡或通知)。
创建展开的气泡
您可以将气泡配置为自动以展开状态显示。我们建议仅在用户执行会产生气泡的操作(例如点按按钮以发起新对话)时才使用此功能。在这种情况下,也可以禁止发送在创建气泡时发送的初始通知。
您可以使用以下方法设置启用这些行为的标志:setAutoExpandBubble() 和setSuppressNotification()。
以下示例展示了如何将气泡配置为自动以展开状态显示:
val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
气泡内容生命周期
当气泡展开时,内容 activity 会经历正常的进程生命周期,从而使应用成为前台进程(如果尚未成为前台进程)。
当气泡收起或关闭时,activity 会被销毁。这可能会导致进程被缓存,随后被终止,具体取决于应用是否运行了其他前台组件。
何时显示气泡
为了减少对用户的干扰,气泡仅在特定情况下显示。
如果应用以 Android 11(API 级别 30)或更高版本为目标平台,则通知不会以气泡形式显示,除非它满足对话要求。如果应用以 Android 10(API 级别 29)或更低版本为目标平台,则只有在满足以下一个或多个条件时,通知才会显示为气泡:
- 该通知使用
MessagingStyle,并添加了Person。 - 该通知来自对
Service.startForeground的调用,其category为CATEGORY_CALL,并且添加了Person。 - 发送通知时,应用在前台运行。
如果这些条件均不满足,系统会显示通知,而不是气泡。
从气泡启动 activity
当气泡启动新 activity 时,新 activity 将在同一任务和同一气泡窗口中启动,或在全屏模式下的新任务中启动,从而收起启动它的气泡。
如需在与气泡相同的任务中启动新 activity,请执行以下操作:
1. 在启动 intent、activity.startActivity(intent) 和 1 时使用 activity 上下文。请勿在 intent 上设置 FLAG_ACTIVITY_NEW_TASK 标志。
否则,新 activity 会在新任务中启动,并且气泡会收起。
请注意,气泡代表特定对话,因此在气泡内启动的 activity 应与该对话相关。此外,在气泡内启动 activity 会增加气泡的任务堆栈,并可能会使用户体验变得复杂,尤其是在导航方面。
最佳做法
- 仅在通知很重要时才以气泡形式发送,例如通知是正在进行的通信的一部分,或者用户明确请求为内容显示气泡。气泡会占用屏幕空间并遮盖其他应用内容。
- 确保气泡通知也能作为普通通知正常运行。当用户停用气泡时,气泡通知会显示为普通通知。
- 使用
BackHandler可组合项,并将其enabled参数与界面状态相关联,以便仅在必要时拦截返回按键操作。处理程序自行停用后,气泡会收起。
当收起的气泡收到更新的消息时,气泡会显示一个标志图标,表示有未读消息。当用户在关联的应用中打开消息时,请按以下步骤操作:
- 更新
BubbleMetadata以抑制通知。调用BubbleMetadata.Builder.setSuppressNotification()。这会移除标记图标,以指示用户已与消息互动。 - 将
Notification.Builder.setOnlyAlertOnce()设置为true,以抑制BubbleMetadata更新时发出的声音或振动。
示例应用
SociaLite 示例应用是一款使用气泡的对话式应用。出于演示目的,此应用使用了聊天机器人。在实际应用中,请使用气泡显示人类的消息。