通知グループを作成する

Android 7.0(API レベル 24)以降、関連する通知を 1 つのグループ内に表示できます(以前は「バンドル」通知と呼ばれていたものです)。たとえば、受信メールに関してアプリが通知を表示する場合、すべての通知を 1 つのグループに入れることで、まとめて折りたたむことができます。

古いバージョンをサポートするために、概要通知を追加することもできます。概要通知は、個々の通知をすべてまとめて全体の概要だけを単独で表示するものです。この方法は、受信トレイスタイルの通知の場合に適しています。

図 1: 通知グループの折りたたみバージョンと展開バージョン

以下の条件がすべて当てはまるユースケースの場合、通知グループを使用することをおすすめします。

  • 子通知も完全な通知であり、グループの概要が不要の場合、個々に表示できる。
  • 子通知を個々に表示する利点がある。次のような例が考えられます。
    • 子通知に対して操作が可能で、各通知に固有の操作がある。
    • 各通知に、ユーザーに表示すべき詳細情報が含まれている。

通知が上記の条件に当てはまらない場合は、代わりに、新しい情報を追加して既存の通知を更新していく方法か、メッセージ スタイルの通知を作成して複数の更新情報を 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 7.0(API レベル 24)以上では、システムが各通知のテキストのスニペットを使用してグループの概要を自動的に作成します。図 1 に示すように、ユーザーはこの通知を展開して各通知を個々に確認できます。ネストされた通知グループを表示できないような、古いバージョンをサポートするには、概要として機能する通知をアプリで別途作成する必要があります。これが唯一の通知として表示され、システムは他のすべてを非表示にします。そのため、この概要に他のすべての通知のスニペットが含まれている必要があり、ユーザーはアプリ内でそのスニペットをタップして開くことができます。

グループ概要を追加する手順は次のとおりです。

  1. グループの説明を含む新しい通知を作成します。通常は、受信トレイスタイルの通知を使用することをおすすめします。
  2. setGroup() を呼び出して、概要通知をグループに追加します。
  3. setGroupSummary(true) を呼び出して、追加した概要通知をグループ概要として使用するように指定します。

たとえば、次のようになります。

Kotlin

    //use constant ID for notification 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 notification 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 が変わらないように、概要通知は 1 回だけ送信します。後で概要情報に変更が生じた場合は、そのときに更新できます(グループにメンバーが追加されたことで、既存の概要の更新が必要になった場合など)。

通知を使用するサンプルコードについては、Android 通知サンプルをご覧ください。