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

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

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

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

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

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

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

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

通知チャンネルを作成する

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

  1. 一意のチャネル ID、ユーザーに表示される名前、重要度を指定して、NotificationChannel オブジェクトを作成します。

  2. 必要に応じて、システム設定内でユーザーに表示する説明を setDescription() で指定します。

  3. createNotificationChannel() に通知チャネルを渡して登録します。

次の例は、通知チャネルを作成して登録する方法を示しています。

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

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

デフォルトでは、特定のチャネルに送信されるすべての通知が、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_*)の定数は、次の表に示すように、ユーザーが認識できる重要度オプションにマッピングされます。

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

音が鳴ります。
IMPORTANCE_DEFAULT PRIORITY_DEFAULT

音が鳴りません。
IMPORTANCE_LOW PRIORITY_LOW

音は鳴らず、ステータスバーにも表示されません。
IMPORTANCE_MIN PRIORITY_MIN
なし
音は鳴らず、ステータスバーやシェードにも表示されません。
IMPORTANCE_NONE N/A

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

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

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

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

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

  1. getNotificationChannel() または getNotificationChannels() を呼び出して、NotificationChannel オブジェクトを取得します。

  2. getVibrationPattern()getSound()getImportance() などの特定のチャネル設定を照会します。

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

通知チャネル設定を開く

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

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

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

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

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

通知チャネルを削除する

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

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

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

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

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

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

  • 2 つのチャンネルを持つ個人アカウント:

    • 新しいコメント

    • おすすめの投稿

  • 2 つのチャネルを持つビジネス アカウント:

    • 新しいコメント

    • おすすめの投稿

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

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

  // 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
  <b>notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))</b>

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

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