Android 10新特性:气泡

本文翻译自:| Bubbles Tutorial for Android 10: Getting Started |

源代码下载:
Download Materials

在2019年的Google I/O大会上, Google宣布了一个叫做Bubbles(气泡)的有趣新特性。

一个bubble(气泡)悬浮在其它的应用内容之上,可以展开,也可以缩小成一个小圆图标。用户可以拖拽这个图标轻松地将它挪动到屏幕的任意位置。

在android 10中,电话应用已经采用了bubbles特性,如果用户在拨打电话的时候切换到其它的应用,电话应用会缩小成一个小巧方便的bubble悬浮在屏幕上。在消息应用程序上,bubbles能够模仿Facebook的聊天头像的特性。

在本文中,你会通过一个叫做Code Coach的anroid 10中的应用程序,学到如何将普通的通知改为bubble。

: 本文默认您掌握了android和kotlin的基础知识.

如果你是android新手,可以查看我们的文章Android tutorials.如果你懂得android但是对kotlin不熟悉,请看文章 Kotlin For Android: An Introduction.

: 至目前为止,Bubbles特性仍然处在开发预览阶段并且仅仅针对开发者使用。请保证你没有在正式产品中使用这个特性. 、
此外,Bubbles不能保证在android 10的模拟器上工作,最好在真机上运行.

开始

本文顶部和底部都有Download Materials的按钮,点击它能够下载项目的源代码,源代码包括Starter和Final两个项目。用as(android studio)打开Starter项目,项目完成loading后,build然后run。


点击应用右上角的按钮。

您将会看到一个来自应用Code Coach的包含随机的、鼓舞人心引语的通知,点击这个通知,然后会打开一个activity页面,页面会展示这个引语的详细信息。

既然应用的通知给了你灵感,那么,在你指尖上的bubble给你带来灵感不也是很好吗?现在,您将改造此应用,以便你在设备上执行多任务时能够随时获得灵感!

更多关于android中的Bubbles

相比SYSTEM_ALERT_WINDOW来说,Bubbles的设计更加安全。Android 10对SYSTEM_ALERT_WINDOW做了更加严格的限制,而且 新的Android Go设备不再包含它
Bubbles是通知系统的一部分。如果用户锁屏或者打开了息屏显示(always-on-display),bubble会以普通的通知展示。
在语法上,创建bubble和创建通知几乎一模一样。文章Android Notifications: Getting Started有更多关于android通知的内容。

Bubble的生命周期

Bubble有两个状态:展开和最小化。当bubble展开时,它包含的activity会经历正常的生命周期。如果app还没启动,那么它就会变成前台进程(foreground process)。当bubble折叠或者用户取消它,它包含的activity会被销毁。系统会缓存或者杀死app进程,这取决于该app是否还有其它前台组件(foreground component)在运行。

设置显示Bubble的正确条件

为了显示Bubble,至少要满足下面的其中一个条件:

  • 通知添加一个Person并且使用MessagingStyle。
  • 通知添加一个Person, 有一个Notification.CATEGORY_CALL的category并且通过Service.startForeground方式调用。
  • 要有一个前台的app能够发送通知。
最佳实践

当你和Bubbles交互时,请记住以下几点:

  • Bubbles是可选特性。如果用户禁止了bubbles,那么bubble会以普通通知的形式展示。因此,请保证bubble能够以普通通知的形式工作。
  • Bubbles会占用宝贵的屏幕空间。除非用户明确需要app使用bubble,并且仅为重要事务使用bubble,比如进行中的通信。
  • bubble里启动的activity会在bubble的区域里显示,这意味着这个activity会有任务栈(task stack)。因此,请保证bubble里的activity的简洁和特定化。

既然已经了解了bubbles,是时候用bubble魔法棒做些东西了!

在设备上开启Bubbles功能

Android 10默认禁止Bubbles。至目前为止,这个特性仍然处于开发预览阶段,功能的开启和关闭在开发者选项中。
点击 设置开发者选项气泡, 然后将开关打开(不同型号手机有略微差别)。


现在已经开启了 bubbles, 可以更新这个app了。

更新Android Manifest

下一步是将使用Bubble特新的Activity添加到androidmanifest.xml中。
Bubble的activity必须是embedded 并且 always launch in document UI mode,属性 resizeable是可选的,前两项是缺一不可的, 否则将会出现普通的通知而不是气泡。
打开 AndroidManifest.xml 在QuoteBubbleActivity的标签中添加下面的属性:

android:allowEmbedded="true"
android:documentLaunchMode="always"
android:resizeableActivity="true"

The code above allows you to make sure you can resize, embed and launch the Activity in document mode.
上面的代码允保证你的Activity能够调整大小、嵌入、文档模式。
下面看下创建通知的代码。

创建通知

打开 model/NotificationHelper.kt文件,setUpNotificationChannels方法创建通知的channel下面是showNotification代码:

fun showNotification(quote: Quote, fromUser: Boolean) {
  // Create Icon
  val icon = createIcon()
  // Create the Person
  val person = createPerson(icon)
  // Create the Notification
  val notification = createNotification(quote, icon, person)
  // Build and Display the Notification
  notificationManager.notify(NOTIFICATION_ID, notification.build())
}

上面就是显示通知的代码,解释下:

  • createIcon为通知创建icon图标;
  • createPerson创建绑定通知的Person,由于这是个MessagingStyle类型的通知;
  • 最后, createNotification用person和icon创建一个通知;
  • notify用来展示创建好的通知;

重要的是通知要基于自己的模式,以防Bubble功能禁用的情况下通知能够正常显示:

fun createNotification(quote: Quote, icon: Icon, person: Person): 
    Notification.Builder {
  return Notification.Builder(context, CHANNEL_QUOTES)
    .setContentTitle("Code Coach")
    .setLargeIcon(icon)
    .setSmallIcon(icon)
    .setCategory(Notification.CATEGORY_MESSAGE)
    .setStyle(Notification.MessagingStyle(person)
      .setGroupConversation(false)
      .addMessage(quote.quoteText, currentTimeMillis(), person)
    )
    .addPerson(person)
    .setShowWhen(true)
    .setContentIntent(createIntent(REQUEST_CONTENT))
}

这个方法设置了通知的title、largeicon、category、style和contentIntent,创建了一个MessagingStyle并用一个名言作为显示的内容。

现在你已经知道了如何创建一个通知,下面,在Bubble功能开启的情况下,添加一些代码,将通知改为Bubble。

创建Bubble Metadata

为了将通知转为Bubble,需要为通知设置BubbleMetadata,BubbleMetadata包含了bubble的一些属性:

fun createBubbleMetadata(icon: Icon, fromUser: Boolean):
    Notification.BubbleMetadata {
  return Notification.BubbleMetadata.Builder()
    .setDesiredHeight(R.dimen.bubble_height)
    .setIcon(icon)
    .apply {
    if (fromUser) {
      setAutoExpandBubble(false)
      setSuppressNotification(true)
    }
  }
  .setIntent(createIntent(REQUEST_BUBBLE))
  .build()
 }

BubbleMetadata有下面一些属性:

  • 气泡的高度(不生效);
  • 气泡的圆形图标;
  • setAutoExpandBubble指定气泡第一次出现时的状态:折叠或者展开,默认是false;
  • setSuppressNotification 决定气泡是否不跟随通知一起出现,默认false,即跟随;
  • setIntent指定点击气泡时的Intent。

现在调用createBubbleMetadata方法:

// Create the Bubble's Metadata
val bubbleMetaData = createBubbleMetadata(icon, fromUser)

// Set the bubble metadata
notification.setBubbleMetadata(bubbleMetaData)

上面的代码创建了BubbleMetadata并加入到通知中。如果设备允许了bubble功能,振奋人心的名言就会以气泡的样式出现而不是通知,现在编译运行:

可以看到bubble并没有展开而且没有出现通知,因为setSuppressNotification设置为true,当出现气泡的时候就没有必要出现通知了。

使用气泡

点击Home键,app进入后台,气泡仍然存在。

拖动气泡移动到屏幕的不同位置,注意观察气泡怎么更新显示的名言:


将气泡拖动到屏幕底部中间位置可以删除气泡。

恭喜,现在你已经构建了你的第一个气泡:]

现在,我们以默认展开的方式启动气泡。

启动展开的气泡

回到NotificationHelper.kt文件更新方法createBubbleMetadata, setAutoExpandBubble从false改为true:

setAutoExpandBubble(true)

重新运行app:

可以看到,气泡悬浮到了屏幕顶部中央,并且默认是展开样式。

如果想要取消气泡的功能,该怎么办呢?

取消Bubbles功能

如果想要屏蔽bubble,可以从三个方面:从系统层屏蔽、应用层屏蔽、渠道层屏蔽。

点击 设置 ▸ 应用和通知 ▸ 在最近打开的应用里选择RW Code Coach,选择 通知 , 点击Bubbles,会有三个选项如图所示:

三个选项.png

选择第三个选项:Nothing can bubble,重启app,发现不会再出现气泡而是通知,因此,在气泡功能禁用的时候请保证通知功能正常。

也可以在渠道层屏蔽气泡,渠道是 Android8.0 Android Oreo--Notifications
引入的一个新功能。 在上图三个选项.png这个界面,点击最下方的对话渠道进入新的设置页面:

会话渠道设置.png

可以看到这个页面里有一个控制气泡功能的Switch开关。

未来如何?

你可以点击文章最上方或者最下方的Download Materials按钮下载源代码。

关于气泡的更多,请访问 Android官方文档

学习更多通知方面的知识,参加课程Android Background Processing

学习Bubble更多的高级应用,访问github repo.

Download Materials

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272