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

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

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 など)で定義された表示と音声の動作が使用されます(重要度について詳しくは、下記の説明をご覧ください)。

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

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 オブジェクトをそのグループに関連付けることができます。

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