建立通知群組

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

如要支援較舊版本,請新增一則摘要通知,做為所有個別通知的摘要。通常建議使用收件匣樣式的通知

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

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

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

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

    • 這些通知可供採取行動,且每則通知都有特定動作。

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

如果通知不符合上述條件,建議您改為更新現有通知,並提供新資訊,或是建立訊息式通知,在同一則對話中顯示多個更新。

建立群組並新增通知

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

Kotlin

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()

Java

String GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL";

Notification newMessageNotification = new NotificationCompat.Builder(MainActivity.this, 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_ALLGROUP_ALERT_CHILDREN

設定群組摘要

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

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

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

即使較新的 Android 版本不會顯示您設計的群組摘要文字,您仍必須手動設定摘要,才能啟用分組通知。部分裝置類型 (例如穿戴式裝置) 的群組摘要行為可能會有所不同。在群組摘要中設定豐富的內容有助於在所有裝置和版本上提供最佳體驗。

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

  1. 建立含有群組說明的新通知,通常使用收件匣樣式的通知最好。

  2. 呼叫 setGroup() 即可將摘要通知新增至群組。

  3. 請呼叫 setGroupSummary(true),指定該值必須用於群組摘要。

以下程式碼顯示如何建立群組摘要的範例:

Kotlin

// 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)
}

Java

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

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

Notification newMessageNotification2 =
    new NotificationCompat.Builder(MainActivity.this, 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();

Notification summaryNotification =
    new NotificationCompat.Builder(MainActivity.this, 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(new 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 notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(emailNotificationId1, newMessageNotification1);
notificationManager.notify(emailNotificationId2, newMessageNotification2);
notificationManager.notify(SUMMARY_ID, summaryNotification);

摘要通知 ID 必須保持不變,只發布一次,因此您可以在摘要資訊有異動時更新 ID。日後新增的群組必須更新現有的摘要。

如需使用通知的程式碼範例,請參閱 Android 通知範例

自動分組

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

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