The Android Developer Challenge is back! Submit your idea before December 2.

通知グループを作成する

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

古いバージョンをサポートするには、別々の通知をすべて概要だけを表示する概要通知も追加することができます。これは受信トレイ通知で行うのが多くの場合最善です。

図 1. 通知グループの折りたたみと展開

ご自分のユースケースで以下の条件がすべて当てはまれば、通知グループを使用してください。

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

通知が上記の条件に当てはまらない場合、その代わりに、新しい情報を含めて既存の通知を更新する方法か、メッセージ スタイルの通知を作成して複数の最新情報を同じ会話内に表示する方法を検討してください。

グループを作成して通知を追加する

通知グループを作成するには、そのグループに固有の識別文字列を定義します。その後は、グループ内の通知ごとに 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 のサンプル通知をご覧ください。