Android Q 气泡

本节内容测试Android Q新功能 —— 气泡


气泡是Android Q中的一项新功能。通过气泡,用户可以轻松地从设备上的任何位置进行多任务处理。 气泡内置于通知系统中。 它们会浮动在其他应用内容之上,并随时随地关注用户。 可以扩展气泡以显示应用程序功能和信息,并且可以在不使用时折叠。

当设备被锁定或始终显示处于活动状态时,气泡就会像通常那样出现。

气泡是一种选择退出功能。 当应用程序显示其第一个气泡时,会显示一个权限对话框,提供两个选项:

1.阻止您应用中的所有气泡 - 通知不会被阻止,但它们永远不会显示为气泡

2.允许来自您应用的所有气泡 - 使用BubbleMetaData发送的所有通知都将显示为气泡

Bubble API

气泡是通过通知API创建的,您可以像往常一样发送通知。如果你想让它冒泡,你需要附加一些额外的数据到它。

气泡的展开视图是由您选择的Activity创建的。需要将Activity配置为适当显示为气泡。该Activity必须可调整大小嵌入并始终以文档UI模式启动。如果它缺少这些要求中的任何一个,它将以通知的形式显示。

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

1
2
3
4
5
6
7
8
<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"
/>

如果您的应用程序显示多个相同类型的气泡,比如多个联系人的聊天对话,则该活动必须能够启动多个实例。将documentLaunchMode设置为“always”。

要发送气泡,请遵循以下步骤:

1、像平常一样创建通知。

2、调用Notification.BubbleMetadata.Builder创建一个BubbleMetadata对象。

3、使用setBubbleMetadata将元数据添加到通知中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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)
// Note: although you can set the icon is not displayed in Q Beta 2
.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)

注意:第一次发送显示气泡的通知时,它必须位于IMPORTANCE_HIGH的通知通道中。这是因为气泡是由通知重要性管理器处理的。如果系统在用户有机会允许或阻止冒泡之前降低了通知的重要性,则通知将不会冒泡。

如果您的应用程序在发送气泡时位于前台,那么重要性将被忽略,并且您的气泡将始终显示(除非用户已经阻止了气泡或来自应用程序的通知)。

创建扩展的气泡

您可以配置气泡以自动将其呈现为展开状态。 我们建议仅在用户执行可能导致冒泡的操作时使用此功能,例如点按按钮以开始新聊天。 在这种情况下,抑制创建气泡时发送的初始通知也是有意义的。

您可以使用一些方法来设置启用这些行为的标志:setAutoExpandBubble()setSuppressInitialNotification

注意:虽然您可以在Android Q Beta 2中设置这些标志,但它们还没有任何效果。

1
2
3
4
5
6
val bubbleMetadata = Notification.BubbleMetadata.Builder()
.setDesiredHeight(600)
.setIntent(bubbleIntent)
.setAutoExpandBubble(true)
.setSuppressInitialNotification(true)
.build()

最佳实践

1、气泡占据了屏幕空间,并覆盖了其他应用程序内容。只有在非常重要的情况下(比如正在进行的通信),或者用户明确要求某些内容使用冒泡时,才应该将通知作为冒泡发送。

2、注意,用户可以禁用气泡。在这种情况下,气泡通知显示为正常通知。您应该始终确保气泡通知与正常通知一样工作。

3、从气泡中启动的流程(如活动和对话框)出现在气泡容器中。这意味着一个气泡可以有一个任务堆栈。如果气泡中有很多功能或导航,事情就会变得复杂。我们建议保持功能尽可能的具体和轻量级。

测试示例

创建BubbleActivity,在AndroidManifest.xml添加如下代码

1
2
3
4
5
6
<activity android:name=".BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:documentLaunchMode="always"
android:resizeableActivity="true">

其中AppTheme.NoActionBar主题代码

1
2
3
4
5
6
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>

在MainActivity中,定义NotificatioManager对象

1
private var notificationManager: NotificationManager? = null

并在onCreate方法初始化

1
notificationManager = this@MainActivity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

定义常量

1
2
3
4
companion object {
private const val REQUEST_CONTENT = 1
private const val REQUEST_BUBBLE = 2
}

定义显示Bubble气泡的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
private fun showBubble() {
Log.d(tag, "show bubble")

//创建通知渠道
val channel = NotificationChannel("通知渠道ID", "通知渠道名称", NotificationManager.IMPORTANCE_HIGH)
notificationManager!!.createNotificationChannel(channel)
//
val icon = Icon.createWithResource(this@MainActivity, R.mipmap.ic_launcher_round)
//
val person = Person.Builder()
.setName("Person Name")
.setIcon(icon)
.build()

val contentIntent = PendingIntent.getActivity(
this@MainActivity,REQUEST_CONTENT,
Intent(this@MainActivity, MainActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)

val bubbleIntent = PendingIntent.getActivity(
this@MainActivity,
REQUEST_BUBBLE,
Intent(this@MainActivity, BubbleActivity::class.java),
PendingIntent.FLAG_UPDATE_CURRENT)

val bubbleMetadata = Notification.BubbleMetadata.Builder()
.setDesiredHeight(400)
.setIcon(icon)
.setAutoExpandBubble(true)
.setSuppressInitialNotification(true)
.setIntent(bubbleIntent)
.build()

val builder = Notification.Builder(this@MainActivity, "通知渠道ID")
.setContentTitle("Bubble")
.setContentText("测试Android Q Bubble")
.setContentIntent(contentIntent)
.setSmallIcon(icon)
.setBubbleMetadata(bubbleMetadata)
.addPerson(person)
.setShowWhen(true)
notificationManager!!.notify(0, builder.build());
}

在按钮的点击事件中调用showBubble方法,触发通知,并显示气泡

通知栏出现通知消息,屏幕右侧显示出了气泡(气泡好像没有图标,上文中有提到,即使设置了也不会在Q Beta 2上显示)

android-q-beta2-bubble-0

下拉通知栏,可以看到创建的通知消息

android-q-beta2-bubble-1

长按快捷方式的效果

android-q-beta2-bubble-2

点击气泡,会触发打开BubbleActivity并弹出窗口,可以看到右上角两个图标,左下角一个,右下角一个

android-q-beta2-bubble-3

首先我们看看左下角的图标,点击了会弹出两个选项,一个添加应用快捷方式,另一个设置壁纸

android-q-beta2-bubble-4

点击第一个添加应用快捷方式,可以列出当前设备安装的应用

android-q-beta2-bubble-5

随机点了两个,一个微信,一个支付宝,添加进去。添加完成之后,从此处点击过去,就能直接打开跳转到指定的应用程序 (添加进去还没测试如何移除,试过了清除数据和重新安装都没效果)

android-q-beta2-bubble-6

点击右上角箭头的的图标可以直接进入 —— MainActivity

点击右上角的齿轮,可以跳转的该应用的通知的设置

android-q-beta2-bubble-7

点击具体的一条通知渠道后面的齿轮,可以详细的进入具体的通知渠道设置

android-q-beta2-bubble-8

然后气泡右下角的图标,类似于快捷launcher桌面,可以直接访问桌面的所有应用程序,点击也是直接打开跳转到指定的应用程序中

android-q-beta2-bubble-9

最后,长按气泡图标,拖拽到底部指定区域,可以销毁气泡

android-q-beta2-bubble-10

判断是否允许了气泡的方法

1
2
3
4
fun canBubble(): Boolean {
val channel = notificationManager!!.getNotificationChannel("通知渠道ID")
return notificationManager!!.areBubblesAllowed() && channel.canBubble()
}

本文参考官方文档官方示例简单总结,感谢您的阅读。如有不足,欢迎指正

if (本文对您有用) { Pay (请随意¥打赏) } else { Commit feedback (底部评论区提交建议、反馈) } 感谢支持!