利用對話框讓使用者參與對話

對話框可讓使用者輕鬆查看和參與對話。

圖 1.即時通訊泡泡。

對話框內建在通知系統中,這類廣告會浮動顯示在其他應用程式內容上方,且會在使用者移動時跟隨使用者。使用者可以展開對話框來顯示應用程式的功能和資訊,也可以在未使用時收合泡泡。

當裝置處於鎖定狀態或啟用螢幕長亮模式時,對話框會以正常方式顯示。

對話框是選用功能。當應用程式顯示第一個對話框時,權限對話方塊會提供兩個選項:

  • 封鎖應用程式的所有對話框。通知不會遭到封鎖,但不會顯示為對話框。
  • 允許應用程式的所有對話框。透過 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"

如要傳送對話框,請按照下列步驟操作:

  1. 照常建立通知
  2. 呼叫 BubbleMetadata.Builder(PendingIntent, Icon)BubbleMetadata.Builder(String),建立 BubbleMetadata 物件。
  3. 使用 setBubbleMetadata() 為通知新增中繼資料。
  4. 如果指定 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 以下版本,只有在符合下列一或多個條件時,通知才會以對話框形式顯示:

如未符合上述任一條件,系統就會顯示通知,而非對話框。

最佳做法

  • 僅在重要時以對話框形式傳送通知,例如通知屬於持續性通訊的一部分,或使用者明確要求以對話框形式顯示內容時。對話框會使用螢幕空間,並覆蓋其他應用程式內容。
  • 確認對話框通知也能正常運作。當使用者停用對話框時,對話框通知會以一般通知的形式顯示。
  • 請盡可能提供精簡的具體功能。透過對話框啟動的程序 (例如活動和對話方塊) 會顯示在對話框容器中。這表示對話框可以有工作堆疊。如果對話框中有許多功能或導覽項目,情況可能就比較複雜。
  • 在對話框活動中覆寫 onBackPressed 時,呼叫 super.onBackPressed。否則對話框可能無法正常運作。

收合的對話框收到新訊息時,對話框會顯示標記圖示,指出未讀訊息。使用者在相關應用程式中開啟訊息時,請按照下列步驟操作:

範例應用程式

People 範例應用程式是使用對話框的簡易對話應用程式。為進行示範,這個應用程式使用聊天機器人在實際應用程式中,對話框只能使用真人傳送的訊息,不能使用機器人。