對話框可讓使用者輕鬆查看及參與對話。
對話框內建在通知系統中,不但會浮動顯示在其他應用程式內容上方,且無論使用者瀏覽到何處,對話框都會出現在畫面上。對話框在展開狀態下可提供應用程式功能和資訊,並可在未使用時收合。
當裝置處於鎖定狀態或啟用持續待機螢幕時,對話框只會以一般通知的形式顯示。
對話框是選用功能。當應用程式顯示第一個對話框時,畫面上會顯示權限對話方塊,當中提供兩個選項:
- 封鎖應用程式的所有對話框 - 通知不會遭到封鎖,但一律不會以對話框形式顯示
- 允許應用程式的所有對話框:透過
BubbleMetaData
傳送的所有通知都會以對話框形式顯示
對話框 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 以上版本,對話框中繼資料或通知就必須參照共用捷徑。
Kotlin
// Create bubble intent val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */) val category = "com.example.category.IMG_SHARE_TARGET" val chatPartner = Person.Builder() .setName("Chat partner") .setImportant(true) .build() // Create sharing shortcut val shortcutId = generateShortcutId() val shortcut = ShortcutInfo.Builder(mContext, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.name) .build() // Create bubble metadata val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create notification, referencing the sharing shortcut val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Java
// Create bubble intent Intent target = new Intent(mContext, BubbleActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0 /* flags */); private val CATEGORY_TEXT_SHARE_TARGET = "com.example.category.IMG_SHARE_TARGET" Person chatPartner = new Person.Builder() .setName("Chat partner") .setImportant(true) .build(); // Create sharing shortcut private String shortcutId = generateShortcutId(); ShortcutInfo shortcut = new ShortcutInfo.Builder(mContext, shortcutId) .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.getName()) .build(); // Create bubble metadata Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create notification, referencing the sharing shortcut Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner);
如果應用程式在傳送對話框時位於前景,系統會忽略重要性且一律會顯示對話框 (除非使用者封鎖應用程式的對話框或通知)。
建立展開的對話框
您可以設定讓對話框自動以展開狀態顯示。建議您只在使用者執行會產生對話框的操作 (例如輕觸按鈕來發起新的即時通訊) 時,才使用這項功能。在這種情況下,您也可以讓系統在建立對話框時隱藏所傳送的初始通知。
您可以透過以下兩種方法來設定啟用這些行為的標記:setAutoExpandBubble()
和 setSuppressNotification()
。
Kotlin
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Java
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
對話框內容生命週期
對話框展開時,內容活動會進入一般程序生命週期,讓應用程式成為前景程序 (如果還不是前景程序的話)。
對話框收合或關閉時,該活動會遭到刪除。視應用程式是否有任何其他執行中的前景元件而定,這可能會讓系統為程序建立快取,並在之後刪除該程序。
對話框顯示時機
為減少對使用者造成的干擾,對話框只會在特定情況下顯示。
如果應用程式指定 Android 11 或以上版本,除非通知符合對話規定,否則不會以對話框形式顯示。如果應用程式指定 Android 10,只有在符合下列一或多個條件時,通知才會以對話框形式顯示:
- 通知使用 MessagingStyle 並新增了 Person。
- 通知是因呼叫 Service.startForeground 而產生、具有 CATEGORY_CALL 的類別,並新增了 Person。
- 通知傳送時,應用程式位於前景。
如未符合上述任一條件,系統就會顯示通知而非對話框。
最佳做法
- 對話框會占用螢幕空間並遮蓋其他應用程式內容。除非是重要通知 (例如持續進行的通訊內容),或使用者明確要求以對話框形式顯示某些內容,否則請不要以對話框形式傳送通知。
- 請注意,使用者可以停用對話框。在這種情況下,對話框通知會以一般通知的形式顯示。請務必確保對話框通知也能像一般通知一樣運作。
- 透過對話框啟動的程序 (例如活動和對話方塊) 會顯示在對話框容器中。這表示對話框可以有工作堆疊。如果對話框中有許多功能或導覽項目,情況可能會較複雜。建議您盡可能讓對話框中的功能保持精簡明確。
- 覆寫對話框活動中的 onBack Pressed 時,請務必呼叫 super.onBackPressed,否則對話框可能無法正常運作。
- 收合的對話框收到新訊息時,對話框會顯示標記圖示,指出有未讀訊息。當使用者在相關聯應用程式中開啟訊息時,請採取下列步驟:
- 更新
BubbleMetadata
以隱藏通知,並呼叫BubbleMetadata.Builder.setSupressNotification()
。這樣會移除標記圖示,表示使用者已針對訊息採取行動。 - 將
Notification.Builder.setOnlyAlertOnce()
設為 true,封鎖BubbleMetadata
更新時的音效或震動效果。
- 更新
範例應用程式
People 範例應用程式是使用對話框的簡易對話應用程式。為進行示範,這個應用程式使用了聊天機器人。在實際應用程式中,對話框只應用於使用者傳送的訊息,而非機器人傳送的訊息。