通知對話框可讓使用者輕鬆查看及參與對話。
對話框會浮動顯示在其他應用程式內容上方,使用者可以展開對話框來查看及操作應用程式內容,並在未使用時收合。
當裝置處於鎖定狀態或啟用螢幕長亮模式時,對話框只會以一般通知的形式顯示。
通知泡泡是由使用者啟用,方法是輕觸支援泡泡的通知中的泡泡按鈕。這樣一來,特定對話就會一律以泡泡顯示。使用者可以在設定中調整已泡泡化的對話,或修改應用程式的整體設定。
使用者可以執行下列操作:
- 封鎖應用程式的所有通知對話框。通知不會遭到封鎖,但一律不會以對話框形式顯示。
- 允許應用程式顯示選取的通知泡泡。使用泡泡按鈕的通知泡泡屬於「選取」狀態。
- 允許應用程式的所有通知泡泡。透過
BubbleMetadata傳送的所有通知都會以泡泡形式顯示。
Notification Bubble API
通知對話框是使用 Notification API 建立,如要以對話框形式顯示通知,請附加額外資料。
對話框的展開檢視是透過您所選的活動建立。 請設定活動,確保能以對話框形式正確顯示。活動必須可調整大小和內嵌。如果活動不符合其中一項規定,系統就會改為以通知形式顯示。
以下程式碼示範如何實作對話框:
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:resizeableActivity="true"
/>
假如應用程式會顯示相同類型的多個對話(例如與不同聯絡人的多個即時訊息對話),活動必須能夠啟動多個執行個體。在搭載 Android 10 以下版本的裝置上,除非您明確將 documentLaunchMode 設為 "always",否則通知不會顯示為泡泡。從 Android 11 開始,您不必明確設定這個值,因為系統會自動將所有對話的 documentLaunchMode 設為 "always"。
如要傳送通知泡泡,請按照下列步驟操作:
- 照常建立通知。
- 呼叫
BubbleMetadata.Builder(PendingIntent, Icon)或BubbleMetadata.Builder(String)建立BubbleMetadata物件。 - 使用
setBubbleMetadata()為通知新增中繼資料。 - 如果指定 Android 11 (API 級別 30) 以上版本,請確認泡泡中繼資料或通知參照分享捷徑。
- 修改應用程式,不要取消以對話框形式顯示的通知。取消通知會從畫面上移除對話框。開啟對話框會自動隱藏相關聯的通知。
相關步驟如以下範例所示:
// Create a bubble intent. val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* flags */) val category = "com.example.category.IMG_SHARE_TARGET" val chatPartner = Person.Builder() .setName("Chat partner") .setImportant(true) .build() // Create a sharing shortcut. val shortcutId = generateShortcutId() val shortcut = ShortcutInfoCompat.Builder(context, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel("Chat partner name") .build() // Publish the shortcut, otherwise the bubble metadata will not apply. ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) // Create a bubble metadata. val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, IconCompat.createWithResource(context, R.drawable.ic_logo)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.chat) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
如果應用程式在傳送對話框時位於前景,系統會忽略重要性且一律會顯示對話框,除非使用者封鎖應用程式的對話框或通知。
建立展開的對話框
您可以設定讓對話框自動以展開狀態顯示。建議您只在使用者執行會產生對話框的操作 (例如輕觸按鈕來發起新的即時通訊) 時,才使用這項功能。在這種情況下,您也可以讓系統在建立對話框時隱藏所傳送的初始通知。
您可以透過以下兩種方法來設定啟用這些行為的標記:setAutoExpandBubble() 和 setSuppressNotification()。
以下範例說明如何設定對話框,使其自動以展開狀態顯示:
val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
對話框內容生命週期
對話框展開時,內容活動會進入一般程序生命週期,讓應用程式成為前景程序 (如果還不是前景程序的話)。
對話框收合或關閉時,該活動會遭到刪除。視應用程式是否有其他執行中的前景元件而定,這可能會讓系統為程序建立快取,並在之後刪除該程序。
對話框顯示時機
為減少對使用者造成的干擾,對話框只會在特定情況下顯示。
如果應用程式指定 Android 11 (API 級別 30) 以上版本,除非通知符合對話規定,否則不會以對話框形式顯示。如果應用程式指定 Android 10 (API 級別 29) 以下版本,只有在符合下列一或多個條件時,通知才會以對話框形式顯示:
- 通知使用
MessagingStyle並新增了Person。 - 通知是因呼叫
Service.startForeground而產生、具有category的CATEGORY_CALL,並新增了Person。 - 通知傳送時,應用程式位於前景。
如未符合上述任一條件,系統就會顯示通知而非對話框。
從泡泡啟動活動
當對話框啟動新活動時,新活動會在同一個工作和同一個對話框視窗中啟動,或是在全螢幕模式下啟動新工作,並收合啟動該活動的對話框。
如要在與泡泡相同的工作中啟動新活動:
1. 啟動意圖、activity.startActivity(intent) 和 1. 時,請使用活動內容。請勿在 Intent 中設定 FLAG_ACTIVITY_NEW_TASK 旗標。
否則,系統會在新的工作中啟動新活動,並收合泡泡。
請注意,對話泡泡代表特定對話,因此在泡泡內啟動的活動應與該對話相關。此外,在泡泡內啟動活動會增加泡泡的工作堆疊,可能導致使用者體驗複雜化,特別是導覽方面。
最佳做法
- 除非是重要通知 (例如持續進行的通訊內容),或使用者明確要求以對話框形式顯示某些內容,否則請不要以對話框形式傳送通知。對話框會占用螢幕空間並遮蓋其他應用程式內容。
- 請務必確保對話框通知也能像一般通知一樣運作。使用者停用對話框時,對話框通知會以一般通知的形式顯示。
- 使用
BackHandler可組合函式,並將其enabled參數繫結至 UI 狀態,這樣一來,系統只會在必要時攔截返回鍵。處理常式停用後,泡泡就會收合。
收合的對話框收到新訊息時,對話框會顯示標記圖示,指出有未讀訊息。當使用者在相關聯應用程式中開啟訊息時,請採取下列步驟:
- 更新
BubbleMetadata以隱藏通知,並呼叫BubbleMetadata.Builder.setSuppressNotification()。這樣會移除標記圖示,表示使用者已與訊息互動。 - 將
Notification.Builder.setOnlyAlertOnce()設為true,封鎖BubbleMetadata更新時的音效或震動效果。
範例應用程式
SociaLite 範例應用程式是使用對話框的對話應用程式。為進行示範,這個應用程式使用了聊天機器人。在實際應用程式中,對話框只應用於使用者傳送的訊息。