使用通知气泡显示对话

通知气泡让用户可以轻松查看并参与对话。

图 1. 聊天气泡。

它们浮动在其他应用内容上层,用户可以展开气泡以显示应用内容并与之互动,还可以在不使用时收起气泡。

当设备处于已锁定状态或“显示屏始终保持开启状态”处于活动状态时,气泡就会像往常的通知那样显示。

通知气泡由用户启用。用户可以通过点按支持气泡的通知上的气泡按钮来启用通知气泡。这样,特定聊天就会始终显示为气泡。在设置中,用户可以调整已显示为气泡的聊天,或修改整个应用的设置。

用户可以执行以下操作:

屏蔽来自您的应用的所有通知气泡。通知不会被屏蔽,但永远不会显示为气泡。

允许显示来自您的应用的所选通知气泡。使用气泡按钮显示为气泡的通知会被“选中”。

允许显示来自您的应用的所有通知气泡。通过 BubbleMetadata 发送的所有通知都会显示为气泡。

注意 :从 Android 17 开始,气泡已正式成为一种合适的窗口模式,

就像分屏一样。这样,用户就可以将任何应用添加到气泡界面以及通知气泡。

Notification Bubble API

通知气泡是使用通知 API 创建的。如果您希望让通知显示为气泡,请为其附加一些额外的数据。

气泡的展开视图是根据您选择的 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)NotificationsSnippets.kt

**注意**: 首次发送显示气泡的通知时,请确保

您使用的是具有

IMPORTANCE_MIN或

更高级别的通知渠道。如果您的应用在发送气泡时位于前台,则系统会忽略重要程度,并始终会显示相应气泡,除非用户屏蔽了来自您应用中的气泡或通知。

创建展开的气泡

您可以将气泡配置为自动以展开状态显示。我们建议您仅在用户执行会导致显示气泡的操作(例如点按按钮以开始新的聊天)时才使用此功能。在这种情况下,还有必要禁止显示在创建气泡时发送的初始通知。

您可以使用以下方法设置启用这些行为的标志:

setAutoExpandBubble()

setSuppressNotification()。

以下示例展示了如何将气泡配置为自动以展开状态显示:

val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder()

.setDesiredHeight(600)

.setIntent(bubbleIntent)

.setAutoExpandBubble(true)

.setSuppressNotification(true)

.build()NotificationsSnippets.kt

气泡内容生命周期

如果展开气泡,内容 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 上下文

activity.startActivity(intent),以及

1. 请勿在 intent 上设置 FLAG_ACTIVITY_NEW_TASK 标志。

否则,新的 activity 将在新任务中启动,并且气泡会收起。

请注意,气泡代表特定的对话,因此在气泡中启动的 activity 应与该对话相关。此外,在气泡中启动 activity 会增加气泡的任务堆栈,并可能会使用户体验复杂化,尤其是在导航方面。

最佳做法

仅当非常需要显示气泡(例如进行中的通信)或用户明确要求为某些内容显示气泡时,才将通知发送为气泡。气泡会占用屏幕空间并遮盖其他应用内容。

确保您的气泡通知也可以作为一般通知使用。当用户停用气泡时,气泡通知会显示为一般通知。

使用 BackHandler 可组合项,并将其 enabled 参数与您的

界面状态相关联,以便它仅在必要时拦截返回键按下操作。处理程序停用自身后,气泡会收起。

当气泡在收起后收到更新的消息时,气泡会显示一个标志图标,表示有未读消息。当用户在关联的应用中打开消息时,请按以下步骤操作:

更新 BubbleMetadata 以禁止显示通知。调用

BubbleMetadata.Builder.setSuppressNotification()。这会移除标志图标以表示用户处理过信息。

Notification.Builder.setOnlyAlertOnce()

设置为 true,以禁止显示伴随

BubbleMetadata更新的声音或振动。

示例应用

SociaLite 示例应用是一款使用

气泡的对话应用。出于演示目的,此应用使用聊天机器人。在真实的应用中,请使用气泡来显示人类发送的消息。


2年新开4.5万家,1年营收上千亿,网吧又活过来了?
墨迹天气为何「晒黑」了?