Android 10新特性:氣泡

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

源代碼下載:
Download Materials

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

一個bubble(氣泡)懸浮在其它的應(yīng)用內(nèi)容之上,可以展開,也可以縮小成一個小圓圖標(biāo)。用戶可以拖拽這個圖標(biāo)輕松地將它挪動到屏幕的任意位置。

在android 10中,電話應(yīng)用已經(jīng)采用了bubbles特性,如果用戶在撥打電話的時候切換到其它的應(yīng)用,電話應(yīng)用會縮小成一個小巧方便的bubble懸浮在屏幕上。在消息應(yīng)用程序上,bubbles能夠模仿Facebook的聊天頭像的特性。

在本文中,你會通過一個叫做Code Coach的anroid 10中的應(yīng)用程序,學(xué)到如何將普通的通知改為bubble。

: 本文默認(rèn)您掌握了android和kotlin的基礎(chǔ)知識.

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

: 至目前為止,Bubbles特性仍然處在開發(fā)預(yù)覽階段并且僅僅針對開發(fā)者使用。請保證你沒有在正式產(chǎn)品中使用這個特性. 、
此外,Bubbles不能保證在android 10的模擬器上工作,最好在真機(jī)上運(yùn)行.

開始

本文頂部和底部都有Download Materials的按鈕,點(diǎn)擊它能夠下載項(xiàng)目的源代碼,源代碼包括Starter和Final兩個項(xiàng)目。用as(android studio)打開Starter項(xiàng)目,項(xiàng)目完成loading后,build然后run。


點(diǎn)擊應(yīng)用右上角的按鈕。

您將會看到一個來自應(yīng)用Code Coach的包含隨機(jī)的、鼓舞人心引語的通知,點(diǎn)擊這個通知,然后會打開一個activity頁面,頁面會展示這個引語的詳細(xì)信息。

既然應(yīng)用的通知給了你靈感,那么,在你指尖上的bubble給你帶來靈感不也是很好嗎?現(xiàn)在,您將改造此應(yīng)用,以便你在設(shè)備上執(zhí)行多任務(wù)時能夠隨時獲得靈感!

更多關(guān)于android中的Bubbles

相比SYSTEM_ALERT_WINDOW來說,Bubbles的設(shè)計(jì)更加安全。Android 10對SYSTEM_ALERT_WINDOW做了更加嚴(yán)格的限制,而且 新的Android Go設(shè)備不再包含它。
Bubbles是通知系統(tǒng)的一部分。如果用戶鎖屏或者打開了息屏顯示(always-on-display),bubble會以普通的通知展示。
在語法上,創(chuàng)建bubble和創(chuàng)建通知幾乎一模一樣。文章Android Notifications: Getting Started有更多關(guān)于android通知的內(nèi)容。

Bubble的生命周期

Bubble有兩個狀態(tài):展開和最小化。當(dāng)bubble展開時,它包含的activity會經(jīng)歷正常的生命周期。如果app還沒啟動,那么它就會變成前臺進(jìn)程(foreground process)。當(dāng)bubble折疊或者用戶取消它,它包含的activity會被銷毀。系統(tǒng)會緩存或者殺死app進(jìn)程,這取決于該app是否還有其它前臺組件(foreground component)在運(yùn)行。

設(shè)置顯示Bubble的正確條件

為了顯示Bubble,至少要滿足下面的其中一個條件:

  • 通知添加一個Person并且使用MessagingStyle。
  • 通知添加一個Person, 有一個Notification.CATEGORY_CALL的category并且通過Service.startForeground方式調(diào)用。
  • 要有一個前臺的app能夠發(fā)送通知。
最佳實(shí)踐

當(dāng)你和Bubbles交互時,請記住以下幾點(diǎn):

  • Bubbles是可選特性。如果用戶禁止了bubbles,那么bubble會以普通通知的形式展示。因此,請保證bubble能夠以普通通知的形式工作。
  • Bubbles會占用寶貴的屏幕空間。除非用戶明確需要app使用bubble,并且僅為重要事務(wù)使用bubble,比如進(jìn)行中的通信。
  • bubble里啟動的activity會在bubble的區(qū)域里顯示,這意味著這個activity會有任務(wù)棧(task stack)。因此,請保證bubble里的activity的簡潔和特定化。

既然已經(jīng)了解了bubbles,是時候用bubble魔法棒做些東西了!

在設(shè)備上開啟Bubbles功能

Android 10默認(rèn)禁止Bubbles。至目前為止,這個特性仍然處于開發(fā)預(yù)覽階段,功能的開啟和關(guān)閉在開發(fā)者選項(xiàng)中。
點(diǎn)擊 設(shè)置 ? 開發(fā)者選項(xiàng) ? 氣泡, 然后將開關(guān)打開(不同型號手機(jī)有略微差別)。


現(xiàn)在已經(jīng)開啟了 bubbles, 可以更新這個app了。

更新Android Manifest

下一步是將使用Bubble特新的Activity添加到androidmanifest.xml中。
Bubble的activity必須是embedded 并且 always launch in document UI mode,屬性 resizeable是可選的,前兩項(xiàng)是缺一不可的, 否則將會出現(xiàn)普通的通知而不是氣泡。
打開 AndroidManifest.xml 在QuoteBubbleActivity的標(biāo)簽中添加下面的屬性:

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能夠調(diào)整大小、嵌入、文檔模式。
下面看下創(chuàng)建通知的代碼。

創(chuàng)建通知

打開 model/NotificationHelper.kt文件,setUpNotificationChannels方法創(chuàng)建通知的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為通知創(chuàng)建icon圖標(biāo);
  • createPerson創(chuàng)建綁定通知的Person,由于這是個MessagingStyle類型的通知;
  • 最后, createNotification用person和icon創(chuàng)建一個通知;
  • notify用來展示創(chuàng)建好的通知;

重要的是通知要基于自己的模式,以防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))
}

這個方法設(shè)置了通知的title、largeicon、category、style和contentIntent,創(chuàng)建了一個MessagingStyle并用一個名言作為顯示的內(nèi)容。

現(xiàn)在你已經(jīng)知道了如何創(chuàng)建一個通知,下面,在Bubble功能開啟的情況下,添加一些代碼,將通知改為Bubble。

創(chuàng)建Bubble Metadata

為了將通知轉(zhuǎn)為Bubble,需要為通知設(shè)置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有下面一些屬性:

  • 氣泡的高度(不生效);
  • 氣泡的圓形圖標(biāo);
  • setAutoExpandBubble指定氣泡第一次出現(xiàn)時的狀態(tài):折疊或者展開,默認(rèn)是false;
  • setSuppressNotification 決定氣泡是否不跟隨通知一起出現(xiàn),默認(rèn)false,即跟隨;
  • setIntent指定點(diǎn)擊氣泡時的Intent。

現(xiàn)在調(diào)用createBubbleMetadata方法:

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

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

上面的代碼創(chuàng)建了BubbleMetadata并加入到通知中。如果設(shè)備允許了bubble功能,振奮人心的名言就會以氣泡的樣式出現(xiàn)而不是通知,現(xiàn)在編譯運(yùn)行:

可以看到bubble并沒有展開而且沒有出現(xiàn)通知,因?yàn)?code>setSuppressNotification設(shè)置為true,當(dāng)出現(xiàn)氣泡的時候就沒有必要出現(xiàn)通知了。

使用氣泡

點(diǎn)擊Home鍵,app進(jìn)入后臺,氣泡仍然存在。

拖動氣泡移動到屏幕的不同位置,注意觀察氣泡怎么更新顯示的名言:


將氣泡拖動到屏幕底部中間位置可以刪除氣泡。

恭喜,現(xiàn)在你已經(jīng)構(gòu)建了你的第一個氣泡:]

現(xiàn)在,我們以默認(rèn)展開的方式啟動氣泡。

啟動展開的氣泡

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

setAutoExpandBubble(true)

重新運(yùn)行app:

可以看到,氣泡懸浮到了屏幕頂部中央,并且默認(rèn)是展開樣式。

如果想要取消氣泡的功能,該怎么辦呢?

取消Bubbles功能

如果想要屏蔽bubble,可以從三個方面:從系統(tǒng)層屏蔽、應(yīng)用層屏蔽、渠道層屏蔽。

點(diǎn)擊 設(shè)置 ? 應(yīng)用和通知 ? 在最近打開的應(yīng)用里選擇RW Code Coach,選擇 通知 , 點(diǎn)擊Bubbles,會有三個選項(xiàng)如圖所示:

三個選項(xiàng).png

選擇第三個選項(xiàng):Nothing can bubble,重啟app,發(fā)現(xiàn)不會再出現(xiàn)氣泡而是通知,因此,在氣泡功能禁用的時候請保證通知功能正常。

也可以在渠道層屏蔽氣泡,渠道是 Android8.0 Android Oreo--Notifications
引入的一個新功能。 在上圖三個選項(xiàng).png這個界面,點(diǎn)擊最下方的對話渠道進(jìn)入新的設(shè)置頁面:

會話渠道設(shè)置.png

可以看到這個頁面里有一個控制氣泡功能的Switch開關(guān)。

未來如何?

你可以點(diǎn)擊文章最上方或者最下方的Download Materials按鈕下載源代碼。

關(guān)于氣泡的更多,請?jiān)L問 Android官方文檔。

學(xué)習(xí)更多通知方面的知識,參加課程Android Background Processing。

學(xué)習(xí)Bubble更多的高級應(yīng)用,訪問github repo.

Download Materials

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容