對話框可讓使用者輕鬆查看和參與對話。
對話框內建在通知系統中,這類廣告會浮動於其他應用程式內容上方,無論使用者身在何處,都能跟隨使用者。使用者可以展開對話框,查看應用程式內容並進行互動,也可以在未使用應用程式時將其收合。
當裝置處於鎖定狀態或啟用螢幕長亮模式時,對話框會以正常方式顯示。
對話框是選用功能。當應用程式顯示第一個對話框時,權限對話方塊會提供兩個選項:
- 封鎖應用程式的所有對話框。通知不會遭到封鎖,但不會顯示為對話框。
- 允許應用程式的所有對話框。透過
BubbleMetaData
傳送的所有通知都會以對話框形式顯示。
泡泡 API
對話框是透過通知 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 a 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 a 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 a bubble metadata. val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create a notification, referencing the sharing shortcut. val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Java
// Create a 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 a 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 a bubble metadata. Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create a 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
的category
,並新增了Person
。 - 通知傳送時,應用程式位於前景。
如未符合上述任一條件,系統就會顯示通知,而非對話框。
透過對話框啟動活動
當對話框啟動新活動時,新活動會在同一工作和同一個泡泡視窗中啟動,或是在全螢幕的新工作中啟動,並收合啟動的泡泡。
如何在與泡泡相同的工作中啟動新活動:
1. 啟動意圖、activity.startActivity(intent)
和 1 時使用活動情境。請勿在意圖上設定 FLAG_ACTIVITY_NEW_TASK
旗標。
反之,新活動會在新工作中啟動,且對話框會收合。
請注意,對話框代表特定對話,因此在對話框中啟動的活動必須與該對話相關。此外,在對話框中啟動活動會增加泡泡的工作堆疊,甚至可能讓使用者體驗變複雜,特別是在進行導覽方面。
最佳做法
- 僅在重要時以對話框形式傳送通知,例如通知屬於持續性通訊的一部分,或使用者明確要求以對話框形式顯示內容時。對話框會使用螢幕空間,並覆蓋其他應用程式內容。
- 確認對話框通知也能正常運作。當使用者停用對話框時,對話框通知會以一般通知的形式顯示。
- 在對話框活動中覆寫
onBackPressed
時,呼叫super.onBackPressed
。否則對話框可能無法正常運作。
收合的對話框收到新訊息時,對話框會顯示標記圖示,指出未讀訊息。使用者在相關應用程式中開啟訊息時,請按照下列步驟操作:
- 更新
BubbleMetadata
以隱藏通知,呼叫BubbleMetadata.Builder.setSuppressNotification()
。 這樣會移除標記圖示,表示使用者與訊息互動。 - 將
Notification.Builder.setOnlyAlertOnce()
設為true
,隱藏BubbleMetadata
更新時的音效或震動效果。
範例應用程式
People 範例應用程式是使用對話框的對話應用程式。為進行示範,這個應用程式使用聊天機器人在實際應用程式中,使用對話框來傳達幽默感的訊息。