通知チャネルを作成して管理する

Android 8.0(API レベル 26)以降、通知はすべてチャネルに割り当てる必要があります。チャネルごとに、そのチャネルのすべての通知に適用される表示と音声の動作を設定することができます。その後で、ユーザーがこうした設定を変更し、アプリのどの通知チャネルを実際に表示するか、または不要とするかを決めることができます。

チャネルの概要や Android 8.0 で導入された新しい通知機能については、下記の動画をご覧ください。

Android 8.0 の機能を含む通知を使用したサンプルコードについては、Android 通知サンプルをご覧ください。

通知チャネルのユーザー設定は、図 1 に示すように、システム設定内でアプリごとに指定できます。

図 1: 時計アプリの通知設定とそのチャネルの 1 つ

通知チャネルを作成した後に、通知の動作を変更することはできません。その時点で、ユーザーの管理下に入ります。ただし、チャネルの名前と説明はデベロッパーが変更できます。

送信する必要がある通知の明確なタイプごとにチャネルを作成してください。また、アプリユーザーの選択を反映して通知チャネルを作成することもできます。たとえば、メッセージ アプリ内でユーザーが作成した会話グループごとに通知チャネルをセットアップすることができます。

Android 8.0(API レベル 26)をターゲットとしているアプリの場合は、通知チャネルを実装する必要があります。targetSdkVersion が 25 以下に設定されているアプリは、Android 8.0(API レベル 26)以降を搭載しているデバイス上で実行された場合でも、Android 7.1(API レベル 25)以前のデバイス上と同じように動作します。

通知チャネルを作成する

通知チャネルを作成する手順は次のとおりです。

  1. 一意のチャネル ID、ユーザーが認識できる名前、重要度を指定して、NotificationChannel オブジェクトを作成します。
  2. 必要に応じて、システム設定内でユーザーに表示する説明を setDescription() で指定します。
  3. createNotificationChannel() に通知チャネルを渡して登録します。

Kotlin

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // Create the NotificationChannel
        val name = getString(R.string.channel_name)
        val descriptionText = getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
        mChannel.description = descriptionText
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(mChannel)
    }
    

Java

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    

元の値を使用して既存の通知チャネルを新規作成しようとしても、処理は実行されません。そのため、アプリの起動時にこのコードを呼び出しても安全です。

デフォルトでは、このチャネルに送信されるすべての通知が、NotificationManagerCompat クラスの重要度(IMPORTANCE_DEFAULTIMPORTANCE_HIGH など)によって定義される表示動作と鳴動動作を使用します(重要度の詳細については、下記の説明をご覧ください)。

チャネルのデフォルト通知動作を詳細にカスタマイズする場合は、NotificationChannel に対して、enableLights() や、setLightColor()setVibrationPattern() などのメソッドを呼び出します。ただし、チャネルを作成した後は、このような設定を変更することはできません。各動作を有効にするかどうかの最終的な指定は、ユーザーが行います。

また、createNotificationChannels() を呼び出すことにより、1 回の操作で複数の通知チャネルを作成できます。

重要度を設定する

チャネルの重要度は、そのチャネルに送信されるすべての通知の割り込みレベルに影響します。重要度は、NotificationChannel コンストラクタ内で指定する必要があります。重要度を指定する際は、IMPORTANCE_NONE(0) から IMPORTANCE_HIGH(4) までの 5 つのレベルの中から選択します。通知チャネルに割り当てた重要度は、そのチャネルに送信されるすべての通知メッセージに適用されます。

Android 7.1(API レベル 25)以前を搭載しているデバイスをサポートするには、NotificationCompat クラスの優先度定数を使用して、通知ごとに setPriority() を呼び出す必要もあります。

重要度(NotificationManager.IMPORTANCE_*)と優先度定数(NotificationCompat.PRIORITY_*)は、表 1 に示すように、ユーザーが認識できる重要度オプションにマッピングされます。

表 1: チャネルの重要度

ユーザーへの表示の重要度 重要度(Android 8.0 以上) 優先度(Android 7.1 以前)
緊急
音が鳴り、ヘッドアップ通知として表示されます。
IMPORTANCE_HIGH PRIORITY_HIGH または PRIORITY_MAX

音が鳴ります。
IMPORTANCE_DEFAULT PRIORITY_DEFAULT

音は鳴りません。
IMPORTANCE_LOW PRIORITY_LOW

音は鳴らず、ステータスバーにも表示されません。
IMPORTANCE_MIN PRIORITY_MIN

どの重要度であっても、通知はすべて、システム UI の邪魔にならない場所(通知ドロワー内など)に表示されます。また、ランチャー アイコンにバッジとして表示されます(通知バッジの表示方法は変更できます)。

チャネルを NotificationManager に送信した後は、重要度は変更できません。ただし、ユーザーはアプリのチャネル設定をいつでも変更できます。

適切な優先度を選択する方法については、通知設計ガイドの「優先度」をご覧ください。

通知チャネルの設定を読み取る

ユーザーは、バイブレーションや通知音の動作などの通知チャネルの設定を変更できます。ユーザーが通知チャネルに適用した設定を把握する手順は次のとおりです。

  1. getNotificationChannel() または getNotificationChannels() を呼び出して、NotificationChannel オブジェクトを取得します。
  2. getVibrationPattern()getSound()getImportance() などを使用して、各チャネル設定を照会します。

想定しているアプリ動作を妨げると思われるチャネル設定が検出された場合は、ユーザーに設定の変更を提案し、チャネル設定を開くアクションを提供できます(次のセクションをご覧ください)。

通知チャネル設定を開く

通知チャネルを作成した後は、通知チャネルの表示動作や鳴動動作をプログラマティックに変更することはできません。ユーザーだけが、システム設定からチャネル動作を変更することができます。ユーザーが簡単に通知設定にアクセスできるように、このシステム設定を開くアイテムを、アプリの設定 UI に追加してください。

通知チャネルのシステム設定を開くには、ACTION_CHANNEL_NOTIFICATION_SETTINGS アクションを使用する Intent を指定します。

例として、通知チャネルの設定にユーザーをリダイレクトする方法を次のサンプルコードに示します。

Kotlin

    val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
        putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
        putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
    }
    startActivity(intent)
    

Java

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
    startActivity(intent);
    

インテントにはアプリのパッケージ名(アプリケーション ID とも呼ばれます)と、編集するチャネルを指定する 2 つのエクストラが必要です。

通知チャネルを削除する

通知チャネルを削除するには、deleteNotificationChannel() を呼び出します。このプロセスを完了する方法を次のサンプルコードに示します。

Kotlin

    // The id of the channel.
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val id: String = "my_channel_01"
    notificationManager.deleteNotificationChannel(id)
    

Java

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // The id of the channel.
    String id = "my_channel_01";
    notificationManager.deleteNotificationChannel(id);
    

通知チャネル グループを作成する

設定 UI 内のチャネルの表示方法を整理するために、チャネル グループを作成することができます。これは、複数のユーザー アカウントに(仕事用プロファイルなどのために)対応しているアプリにとって便利な機能であり、アカウントごとに通知チャネル グループを作成できます。これにより、同じ名前を持つ複数の通知チャネルを簡単に識別して管理することができます。

図 2: 個人用アカウントと仕事用アカウントでグループ化されている通知チャネル設定

たとえば、ソーシャル ネットワーク アプリで個人用アカウントと仕事用アカウントの両方をサポートしているとします。この場合、アカウントごとに、機能と名前が同じ複数の通知チャネルが必要となることがあります。たとえば、次のような状況が考えられます。

  • 2 つのチャネルを持つ個人用アカウント:
    • 新しいコメント
    • おすすめの投稿
  • 2 つのチャネルを持つ仕事用アカウント:
    • 新しいコメント
    • おすすめの投稿

アカウントごとに通知チャネルをグループにまとめると、ユーザーが簡単に見分けられるようになります。

各通知チャネル グループには、ユーザーに表示される名前だけでなく、パッケージ内で一意の ID が必要です。通知チャネル グループを作成する方法を次のスニペットで示します。

Kotlin

    // The id of the group.
    val groupId = "my_group_01"
    // The user-visible name of the group.
    val groupName = getString(R.string.group_name)
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
    

Java

    // The id of the group.
    String groupId = "my_group_01";
    // The user-visible name of the group.
    CharSequence groupName = getString(R.string.group_name);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));
    

新しいグループを作成したら、setGroup() を呼び出すことで、新しい NotificationChannel オブジェクトをそのグループに関連付けることができます。

チャネルを通知マネージャーに送信した後は、通知チャネルとグループの関連付けを変更することはできません。