气泡

借助气泡,用户可以轻松地在设备上的任何位置进行多任务处理。气泡旨在成为 SYSTEM_ALERT_WINDOW 的替代方案。

气泡内置于“通知”系统中。它们浮动在其他应用内容上层,并会跟随用户转到任意位置。气泡可以展开以显示应用功能和信息,并可在不使用时收起。

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

气泡是一种可以选择停用的功能。在应用显示其第一个气泡时,系统会显示一个权限对话框,其中提供两个选项:

  • 屏蔽来自您的应用的所有气泡 - 通知不会被屏蔽,但永远不会显示为气泡
  • 允许来自您的应用的所有气泡 - 通过 BubbleMetaData 发送的所有通知都会显示为气泡

Bubble API

气泡是通过 Notification API 创建的,您可以照常发送通知。如果您希望让通知显示为气泡,则需要为其附加一些额外的数据。

气泡的展开视图是根据您选择的 Activity 创建的。此 Activity 需要经过配置才能正确显示为气泡。此 Activity 必须可以调整大小、是嵌入式的,并始终可以在文档界面模式下启动。如果不满足其中任何要求,便会改为显示为通知。

以下代码演示了如何实现简单的气泡:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:documentLaunchMode="always"
  android:resizeableActivity="true"
/>

如果您的应用需要显示多个相同类型的气泡(例如与不同联系人的多个聊天对话),则此 Activity 必须能够启动多个实例。请将 documentLaunchMode 设为“always”。

如需发送气泡,请按照以下步骤操作:

Kotlin

// Create bubble intent
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)

// Create bubble metadata
val bubbleData = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIcon(Icon.createWithResource(context, R.drawable.icon))
    .setIntent(bubbleIntent)
    .build()

// Create notification
val chatBot = Person.Builder()
    .setBot(true)
    .setName("BubbleBot")
    .setImportant(true)
    .build()

val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .addPerson(chatBot)

Java

// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

// Create bubble metadata
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIcon(Icon.createWithResource(context, R.drawable.icon))
        .setIntent(bubbleIntent)
        .build();

// Create notification
Person chatBot = new Person.Builder()
        .setBot(true)
        .setName("BubbleBot")
        .setImportant(true)
        .build();

Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .addPerson(chatBot);

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

创建展开的气泡

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

您可以使用以下方法设置启用这些行为的标记: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 会完成常规进程生命周期,这会使应用成为前台进程(如果应用尚未在前台运行)。

如果收起或关闭气泡,系统会销毁此 Activity。这可能导致系统缓存此进程,然后将其终止,具体取决于应用是否有任何其他前台组件正在运行。

何时显示气泡

为了减少对用户造成干扰的次数,气泡仅会在满足以下一个或多个条件时显示:

如果上述条件均不满足,则仅显示通知。

最佳做法

  • 气泡会占用屏幕空间并遮盖其他应用内容。仅当非常需要显示气泡(例如对于进行中的通信)或用户明确要求为某些内容显示气泡时,才将通知发送为气泡。
  • 请注意,用户可以停用气泡。在这种情况下,气泡通知会显示为一般通知。您应该始终确保您的气泡通知也可以作为一般通知使用。
  • 从气泡启动的进程(例如 Activity 和对话框)会显示在气泡容器中。这意味着气泡可以有任务堆栈。如果您的气泡中有很多功能或导航,情况就会变得很复杂。我们建议您尽量让功能保持具体且简明。