建立通知群組

從 Android 7.0 (API 級別 24) 開始,您可以在群組中顯示相關通知。舉例來說,如果應用程式會顯示收到電子郵件的通知,請將所有新郵件通知放在同一群組,這樣通知就會一併收合。

如要支援較低版本,請新增摘要通知,單獨顯示所有個別通知的摘要。通常會使用收件匣樣式的通知。

已收合與已展開的通知群組
圖 1. 已收合 (頂端) 和已展開 (底部) 的通知群組。

如果您的用途符合下列所有條件,請使用通知群組:

  • 子通知是完整的通知,可以個別顯示,不需要群組摘要。

  • 個別顯示子通知有其好處。例如:

    • 每則通知都有專屬動作。

    • 每則通知都會顯示更多資訊供使用者查看。

如果通知不符合上述條件,請考慮更新現有通知,加入新資訊,或建立訊息樣式的通知,在同一個對話中顯示多則更新。

建立群組並在其中新增通知

如要建立通知群組,請為群組定義專屬 ID 字串。 接著,針對群組中的每則通知,呼叫 setGroup 並傳遞群組名稱。例如:

val GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL"

val newMessageNotification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
    .setSmallIcon(R.drawable.new_mail)
    .setContentTitle(emailObject.getSenderName())
    .setContentText(emailObject.getSubject())
    .setLargeIcon(emailObject.getSenderAvatar())
    .setGroup(GROUP_KEY_WORK_EMAIL)
    .build()

根據預設,系統會依通知發布時間排序,但您可以呼叫 setSortKey 變更排序。

如果通知群組的快訊必須由其他通知處理,請呼叫 setGroupAlertBehavior。舉例來說,如要讓群組摘要發出音效,群組中的所有孩子都必須啟用群組快訊行為 GROUP_ALERT_SUMMARY。其他選項為 GROUP_ALERT_ALL 和 GROUP_ALERT_CHILDREN。

設定群組摘要

分組通知必須有額外的通知,做為群組摘要。如要啟用通知群組功能,請務必設定群組摘要。這個群組摘要必須包含群組中其他各個通知的部分文字,協助使用者瞭解群組中的內容。群組摘要的顯示方式取決於 Android 版本:

  • Android 7.0 (API 級別 24) 以下版本無法顯示巢狀通知群組,因此系統只會顯示群組摘要通知,並隱藏所有其他通知。使用者可以輕觸群組摘要通知,開啟應用程式。

  • 在 Android 7.0 以上版本中,系統會將群組摘要通知顯示為巢狀通知群組,並標示每個群組通知的文字片段。不會顯示您在群組摘要通知中設定的文字。使用者可以展開巢狀通知群組,查看群組中的個別通知,如圖 1 所示。

即使較新版本的 Android 不會顯示您設計的群組摘要文字,您仍須手動設定摘要,才能啟用群組通知。群組摘要的行為可能會因某些裝置類型而異,例如穿戴式裝置。為群組摘要設定多媒體內容,有助於在所有裝置和版本上提供最佳體驗。

如要新增群組摘要,請按照下列步驟操作:

  1. 建立新通知,並附上群組說明,通常最好使用收件匣樣式通知。

  2. 呼叫 setGroup,將摘要通知新增至群組。

  3. 呼叫 setGroupSummary(true),指定必須將其做為群組摘要。

以下程式碼範例說明如何建立群組摘要:

// Use constant ID for notifications used as group summary.
val SUMMARY_ID = 0
val GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL"

val newMessageNotification1 = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_notify_email_status)
    .setContentTitle(emailObject1.getSummary())
    .setContentText("You will not believe...")
    .setGroup(GROUP_KEY_WORK_EMAIL)
    .build()

val newMessageNotification2 = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_notify_email_status)
    .setContentTitle(emailObject2.getSummary())
    .setContentText("Please join us to celebrate the...")
    .setGroup(GROUP_KEY_WORK_EMAIL)
    .build()

val summaryNotification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
    .setContentTitle(emailObject.getSummary())
    // Set content text to support devices running API level < 24.
    .setContentText("Two new messages")
    .setSmallIcon(R.drawable.ic_notify_summary_status)
    // Build summary info into InboxStyle template.
    .setStyle(
        NotificationCompat.InboxStyle()
            .addLine("Alex Faarborg Check this out")
            .addLine("Jeff Chang Launch Party")
            .setBigContentTitle("2 new messages")
            .setSummaryText("janedoe@example.com")
    )
    // Specify which group this notification belongs to.
    .setGroup(GROUP_KEY_WORK_EMAIL)
    // Set this notification as the summary for the group.
    .setGroupSummary(true)
    .build()

NotificationManagerCompat.from(this).apply {
    notify(emailNotificationId1, newMessageNotification1)
    notify(emailNotificationId2, newMessageNotification2)
    notify(SUMMARY_ID, summaryNotification)
}

摘要通知 ID 必須維持不變,這樣系統只會發布一次通知,而且摘要資訊變更時,您之後可以更新通知。後續新增至群組的項目必須更新現有摘要。

自動分組

在 Android 7.0 (API 級別 24) 以上版本中,如果應用程式傳送通知,但未指定群組鍵或群組摘要,系統可能會自動將這些通知歸為一組。自動分組的通知會顯示群組摘要通知,並標有部分分組通知的文字片段。使用者可以展開這則摘要通知,查看每則通知,就像手動分組的通知一樣。

部分裝置類型可能會自動分組,為確保所有裝置和版本都能提供最佳體驗,如果通知必須分組,請指定群組鍵和群組摘要,確保通知會分組。