本节内容测试Android Q新功能 —— 气泡
当前文章首次编辑于Android Q Beta 2 版本,可能部分内容会在后期版本上发生变化,仅供参考
气泡是Android Q中的一项新功能。通过气泡,用户可以轻松地从设备上的任何位置进行多任务处理。 气泡内置于通知系统中。 它们会浮动在其他应用内容之上,并随时随地关注用户。 可以扩展气泡以显示应用程序功能和信息,并且可以在不使用时折叠。
当设备被锁定或始终显示处于活动状态时,气泡就会像通常那样出现。
气泡是一种选择退出功能。 当应用程序显示其第一个气泡时,会显示一个权限对话框,提供两个选项:
1.阻止您应用中的所有气泡 - 通知不会被阻止,但它们永远不会显示为气泡
2.允许来自您应用的所有气泡 - 使用BubbleMetaData发送的所有通知都将显示为气泡
Bubble API
气泡是通过通知API创建的,您可以像往常一样发送通知。如果你想让它冒泡,你需要附加一些额外的数据到它。
气泡的展开视图是由您选择的Activity创建的。需要将Activity配置为适当显示为气泡。该Activity必须可调整大小、嵌入并始终以文档UI模式启动。如果它缺少这些要求中的任何一个,它将以通知的形式显示。
下面的代码演示了如何实现一个简单的气泡:
1
2
3
4
5
6
7
8
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
6val 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
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
false
true
true
@android:color/transparent
在MainActivity中,定义NotificatioManager对象
1private var notificationManager: NotificationManager? = null
并在onCreate方法初始化
1notificationManager = this@MainActivity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
定义常量
1
2
3
4companion 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
42private 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上显示)
下拉通知栏,可以看到创建的通知消息
长按快捷方式的效果
点击气泡,会触发打开BubbleActivity并弹出窗口,可以看到右上角两个图标,左下角一个,右下角一个
首先我们看看左下角的图标,点击了会弹出两个选项,一个添加应用快捷方式,另一个设置壁纸
点击第一个添加应用快捷方式,可以列出当前设备安装的应用
随机点了两个,一个微信,一个支付宝,添加进去。添加完成之后,从此处点击过去,就能直接打开跳转到指定的应用程序 (添加进去还没测试如何移除,试过了清除数据和重新安装都没效果)
点击右上角箭头的的图标可以直接进入 —— MainActivity
点击右上角的齿轮,可以跳转的该应用的通知的设置
点击具体的一条通知渠道后面的齿轮,可以详细的进入具体的通知渠道设置
然后气泡右下角的图标,类似于快捷launcher桌面,可以直接访问桌面的所有应用程序,点击也是直接打开跳转到指定的应用程序中
最后,长按气泡图标,拖拽到底部指定区域,可以销毁气泡
判断是否允许了气泡的方法
1
2
3
4fun canBubble(): Boolean {
val channel = notificationManager!!.getNotificationChannel("通知渠道ID")
return notificationManager!!.areBubblesAllowed() && channel.canBubble()
}
本文参考官方文档和官方示例简单总结,感谢您的阅读。如有不足,欢迎指正