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

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 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 =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

既存の通知チャンネルを元の値で再作成しても何も行われないため、アプリの起動時にこのコードを呼び出しても問題ありません。

デフォルトでは、特定のチャンネルに投稿されたすべての通知は、NotificationManagerCompat クラスの重要度レベル(IMPORTANCE_DEFAULT や IMPORTANCE_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, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

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

通知チャネルを削除する

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

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

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

設定 UI でチャンネルの表示をさらに整理する場合は、チャンネル グループを作成します。アプリが複数のユーザー アカウントをサポートしている場合は、アカウントごとに通知チャンネル グループを作成できるため、この方法が適しています。チャンネル グループを使用すると、同じ名前の複数の通知チャンネルを区別して管理できます。

図 2. 個人用アカウントと仕事用アカウントのグループを含む通知チャネルの設定。

たとえば、ソーシャル ネットワーキング アプリには、個人用アカウントと仕事用アカウントのサポートが含まれている場合があります。このシナリオでは、各アカウントに、次のような同じ機能と名前を持つ複数の通知チャンネルが必要になる場合があります。

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

    • 新しいコメント

    • おすすめの投稿

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

    • 新しいコメント

    • おすすめの投稿

通知チャンネルをアカウントごとにグループに整理すると、ユーザーがそれらを区別できるようになります。

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

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

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

チャンネルを通知マネージャーに送信すると、通知チャンネルとグループの関連付けを変更できなくなります。