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

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() に渡して登録します。

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

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 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 など)で定義された視覚と聴覚の動作を使用します。重要度について詳しくは、次のセクションをご覧ください。

チャンネルのデフォルトの通知動作をさらにカスタマイズする場合は、NotificationChannelenableLights()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 で、通知チャンネルのシステム設定を開くことができます。

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

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

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

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