android 气泡,Android Q 气泡

47c1b0bfa3554db5aac37722a6d89abc.png

本节内容测试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上显示)

c5220cdd566a0b9c131c47351055a15a.png

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

0adc1514ec91d0d5da349d093f263a2a.png

长按快捷方式的效果

197f0ef56998cf47f2d7a41b170e619e.png

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

9629dff5f54e939e10f9cc960ab44e8c.png

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

246d38c03d51e106050a1c8d6303bdf5.png

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

4a856a7805060dbc8abff01d37b2c58b.png

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

5fac0f1f8fed2ca2c4b751d2d46298f8.png

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

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

eb2dfa0e39ce15a5d2a31f94adbb9f23.png

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

c3081aa575f30eb8330ddbfe34614a69.png

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

f931196a5a43060b87f1668f21359b47.png

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

609b1f7f1ef5efb09f9d9328c0334692.png

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

1

2

3

4fun canBubble(): Boolean {

val channel = notificationManager!!.getNotificationChannel("通知渠道ID")

return notificationManager!!.areBubblesAllowed() && channel.canBubble()

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值