消息气泡可让用户更轻松地查看和参与对话。
气泡内置于通知系统中。浮动在其他应用之上 内容,并关注用户无论走到哪里。用户可以展开气泡 并且能够与应用内容互动 使用它们。
当设备处于锁定状态或“屏幕常亮”处于启用状态时,气泡显示为 通知通常具有哪些功能。
气泡是一种可以选择停用的功能。当应用显示第一个气泡时, 权限对话框提供了两个选项:
- 屏蔽应用中的所有消息气泡。通知不会被屏蔽,但它们 绝不会显示为气泡。
- 允许来自您的应用的所有气泡。通过以下应用发送的所有通知:
BubbleMetaData
以消息气泡的形式显示。
气泡 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 或更高版本为目标平台,请确保气泡 元数据或通知引用的是共享快捷方式。
这些步骤如以下示例所示:
Kotlin
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* 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 = ShortcutInfo.Builder(mContext, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.name) .build() // Create a bubble metadata. val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Java
// Create a bubble intent. Intent target = new Intent(mContext, BubbleActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0 /* flags */); private val CATEGORY_TEXT_SHARE_TARGET = "com.example.category.IMG_SHARE_TARGET" Person chatPartner = new Person.Builder() .setName("Chat partner") .setImportant(true) .build(); // Create a sharing shortcut. private String shortcutId = generateShortcutId(); ShortcutInfo shortcut = new ShortcutInfo.Builder(mContext, shortcutId) .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.getName()) .build(); // Create a bubble metadata. Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create a notification, referencing the sharing shortcut. Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner);
如果应用在发送气泡时处于前台,则系统会忽略重要性 并且始终显示您的气泡,除非用户屏蔽了气泡或通知 。
创建展开的气泡
您可以将气泡配置为自动以展开状态显示。周三 建议仅在用户执行 系统会显示一个气泡,例如点按按钮发起新聊天。在此示例中 还有一种方法可以禁止 显示气泡时发送的初始通知 创建。
您可以使用以下方法设置启用这些行为的标志:
setAutoExpandBubble()
和
setSuppressNotification()
。
以下示例展示了如何将气泡配置为自动显示 广告:
Kotlin
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Java
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
气泡内容生命周期
当气泡展开时,内容活动会经过常规流程, 导致 成为前台进程(如果尚未这样的话)。
当气泡被收起或关闭时,相应 activity 会被销毁。这可能会 会导致进程被缓存,稍后终止,具体取决于 应用有其他前台组件正在运行。
何时显示气泡
为减少对用户的干扰,气泡仅在 情况。
如果应用以 Android 11 或更高版本为目标平台,则通知不会 除非符合对话 要求。如果应用以 Android 10 或更低版本,那么仅当出现以下情况时,通知才会显示为气泡 满足以下一个或多个条件:
- 该通知使用
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 会增加气泡的任务堆栈 并且可能会使用户体验复杂化,特别是 导航。
最佳做法
- 仅以气泡形式发送重要通知,例如在 或是用户明确请求以对话泡形式显示 内容。气泡会占用屏幕空间并遮盖其他应用内容。
- 确保您的气泡通知也能作为正常通知显示。时间 当用户停用气泡时,气泡通知会显示为常规状态, 通知。
- 替换时调用
super.onBackPressed
气泡中的onBackPressed
活动。否则,您的气泡可能无法正常工作。
收起的气泡收到更新消息后,该气泡会显示一个标记 图标表示未读邮件。当用户在 请按照以下步骤操作:
- 更新
BubbleMetadata
以抑制通知的显示。致电BubbleMetadata.Builder.setSuppressNotification()
。 此操作会移除表明用户与消息互动的标记图标。 - 设置
Notification.Builder.setOnlyAlertOnce()
设置为true
,从而抑制BubbleMetadata
随附的声音或振动 更新。
示例应用
通过 人物 示例应用是一个使用气泡的对话应用。出于演示目的 此应用使用了聊天机器人。在实际应用中, 人类。