Notification Channel(ノーティフィケーションチャネル)は、Android 8.0(API 26)で導入されたメカニズムで、ノーティフィケーションをカテゴリ別にグループ化し、ユーザーがその行動を制御できるようにします。各チャネルは、そのチャネルを通して送信されるすべてのノーティフィケーションの重要度レベル、音、バイブレーション、視覚的な装飾を定義します。Android Developersによると、NotificationChannelはAndroid 8+でのすべてのノーティフィケーションに必須です。これがなければノーティフィケーションは表示されません。
メインポイント
Notification Channelは、Android 8+(Oreo)で同じタイプのノーティフィケーションのための論理的なコンテナです。開発者は固有のIDをもつチャネルを作成し、パラメータを設定し、各ノーティフィケーションにこのチャネルを指定して送信します。同じチャネルのすべてのノーティフィケーションは、その設定を継承します。
Android 8以前は、ノーティフィケーション管理は二择ひつでした:全てか無か。ユーザーはアプリのすべてのノーティフィケーションを完全に無効にすることしかできませんでした。チャネルはこの問題を解決しました:今では「広告」ノーティフィケーションを無効にできますが、「友人からのメッセージ」は保持できます。
チャネルを作成した後、その重要度は、ユーザーが設定→アプリ→ノーティフィケーションから随時変更できます。開発者はチャネル作成後にプログラムで重要度を変更できません。これはAndroidのセキュリティ制限です。
Android 8+では、各ノーティフィケーションはNotificationChannelを通じて送信する必要があります。アプリがチャネルなしでノーティフィケーションを表示しようとすると、システムは黙って無視します。例外は、NotificationCompatを使用したデフォルトチャネルのノーティフィケーションです。これはライブラリによって自動的に作成されます。
ノーティフィケーションチャネルは、NotificationChannelクラスを通じて作成する際に設定されるパラメータのセットによって定義されます。主なパラメータは重要度レベルで、ノーティフィケーションがユーザーとどうインタラクションするかを決定します。
作成後、チャネルはシステムのノーティフィケーション設定に表示されます。ユーザーは重要度を変更したり、音を無効にしたり、バイブレーションを無効にしたり、チャネルを完全にブロックしたりできます。すべての変更は、その後のすべてのノーティフィケーションに即時に適用されます。
NotificationChannelを作成する際、次の設定ができます:音(カスタムまたはシステム)、バイブレーション(パターンと持続時間)、ライト指示器(LED色)、バッジアイコン(setShowBadge)、ロック画面(setLockscreenVisibility)、おじゃまにしないモード(setBypassDnd)。これらのパラメータはチャネル作成時に固定され、後で変更できるのはユーザーだけです。
重要度レベルはチャネルの主なパラメータです。ノーティフィケーションが音を鳴らすか、画面に表示されるか、それともシャデウに配置されるだけかを決定します。重要度を優先度と混同してはいけません。重要度はチャネルで設定され、優先度(setPriority)はAndroid 8+では無視されます。
| レベル | 定数 | 行動 | 音 |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | heads-upバナーを表示、シャデウに表示 | あり |
| DEFAULT | IMPORTANCE_DEFAULT (3) | シャデウに表示、heads-upなし | あり |
| LOW | IMPORTANCE_LOW (2) | 音なしでシャデウに表示 | なし |
| MIN | IMPORTANCE_MIN (1) | シャデウのみ、音もバイブレーションもなし | なし |
| NONE | IMPORTANCE_NONE (0) | まったく表示されない | なし |
大多数のユーザーシナリオでは、IMPORTANCE_DEFAULT (3)を使用します。ノーティフィケーションは音なしでシャデウに表示されますが、ポップアップバナーはありません。IMPORTANCE_HIGHは、入電番話、連絡先からのメッセージ、タイマーリマインダーなど、クリティカルなイベントにのみ使用します。
チャネルは、アプリ起動時または初回使用時に一度作成されます。最良の実践は、アプリ起動時にApplication.onCreateメソッドですべてのチャネルを作成することです。既存のチャネルを再作成しても安全です。チャネルが既に存在する場合、Androidはコールを無視します。
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"メッセージ",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "新しいメッセージの通知"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"プロモーションとニュース",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "マーケティング通知と特別オファー"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
ノーティフィケーションを送信する際は、setChannelId(NotificationCompatの場合)またはNotification.BuilderコンストラクタでチャネルIDを指定します。指定されたIDのチャネルが存在しない場合、ノーティフィケーションは表示されませんが、エラーは発生しません。
Androidは、プログラム的なチャネル管理のためのいくつかのAPIを提供しています:リストの取得、削除、現在の設定の確認です。チャネルを削除すると、そのすべてのノーティフィケーションがシステム履歴から削除されます。
val manager =
getSystemService(NotificationManager::class.java)
// すべてのチャネルのリストを取得
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Channels", "${channel.id}: ${channel.importance}")
}
// 現在の重要度を確認(ユーザーが変更している可能性があります)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// ユーザーがチャネルを無効にしました
suggestEnablingChannel()
}
// チャネルを削除
manager.deleteNotificationChannel(CHANNEL_PROMO)
チャネル作成後、開発者はプログラムで重要度を変更できません。これは、悪用からユーザーを守るためのAndroidの制限です。チャネルの重要度を変更する必要がある場合は、異なるIDをもつ新しいチャネルを作成し、ノーティフィケーションを移行します。
既存のチャネルの重要度を変更する必要がある場合は、異なるID(例:“messages_v2”)をもつ新しいチャネルを作成し、そちらにノーティフィケーションの送信を開始します。古いチャネルはdeleteNotificationChannelで削除できます。すべてのノーティフィケーションが履歴から削除されます。ユーザーが設定を失わないように、アプリインターフェイスを通じて移行についてユーザーに警告します。
NotificationChannelGroupは、Androidの設定インターフェイスで複数のチャネルをひとつの視覚グループにまとめます。グループは、アプリが5チャネル以上を使用する場合にユーザーのナビゲーションに役立ちます(例:“ソーシャル”、“システム”、“マーケティング”)。
グループはcreateNotificationChannelGroupで作成され、setGroupメソッドで作成時にチャネルに渡されます。グループを削除すると、そのすべてのチャネルも削除されます。各チャネルは1つのグループにのみ属することができます。
実際には、チャネルグループは3チャネルを超えるアプリに推奨されます。設定でのナビゲーションを簡素化し、チャネルリストを理解せずにユーザーが一度にすべてのノーティフィケーションを無効にしてしまう可能性を低減します。
グループはcreateNotificationChannelGroupを使用して、固有のIDと名称で作成されます。その後、setGroupメソッドを通じて各チャネルがグループに割り当てられます。システム設定では、グループは見出しのあるセクションとして表示され、その下にこのグループのすべてのチャネルが並びます。グループが削除されると、すべてのチャネルもシステムによって自動的に削除され、囒復は不可能です。
適切なノーティフィケーションチャネルの設計は、ユーザーエクスペリエンスとリテンションに直接影響します。主なパターンは3つの重要度レベルです:メッセージと電話用のクリティカルチャネル(IMPORTANCE_HIGH)、一般的なノーティフィケーション用の標準(IMPORTANCE_DEFAULT)、マーケティングとニュース用の静か(IMPORTANCE_LOW)です。この階級により、ユーザーに負荷なしで明確な選択肢が提供されます。
2番目のパターンは、機能モジュールごとのチャネルです。アプリの各メインモジュール(チャット、注文、フィード、マーケティング)に独自のチャネルがあります。5モジュールを超える場合は、それらをNotificationChannelGroupにまとめます。システム設定では、グループは折りたたみ可能な項目のセクションとして表示されます。これによりナビゲーションが簡素化されます。
3番目のパターンは、開発者チャネルです。デバッグ・サービスノーティフィケーション用にIMPORTANCE_MINの独立したチャネルを作成します。ユーザーにはシャデウに表示されませんが、開発者はadbを通じてログを解析できます。プロダクションでは、このチャネルは削除または設定でIntentを通じてインターフェイスから非表示にできます。
4番目のパターンは、チャネルフィードバックです。インターフェイスで、どのチャネルがアクティブで、現在の重要度がどれくらいかをユーザーに表示します。Android 8+では、getNotificationChannelを使用してチャネルのステータスを取得し、チャネルが無効になっている場合に設定を変更するようユーザーに提案できます。これはアプリのクリティカルな機能にとって特に重要です。
よくある質問
ノーティフィケーションは、シャデウでもトレイでも表示されません。システムは黙ってnotify()コールを無視します。例外として、NotificationCompatを使用すると、ライブラリがデフォルトチャネルを作成しますが、その重要度は常にDEFAULTです。常に自分のチャネルを作成することをおすすめします。
チャネルの名称、説明、音は変更できます。しかし、重要度は変更できません。この権限は開発者からシステムによって保護されています。重要度を上げる必要がある場合は、異なるIDの新しいチャネルを作成し、新しいノーティフィケーションに使用します。ユーザーは随時重要度を変更できます。
getNotificationChannelを使用し、重要度を確認します。値がIMPORTANCE_NONEの場合、チャネルは無効になっています。また、Intent:Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGSを使用してapp_packageとchannel_idパラメータでシステムのチャネル設定を開くことができます。
制限はありません。Androidはチャネル数に制限を設けていません。ただし、ユーザーを選択肢で困わせないために3001多くとも5~10のチャネルを作成することが推奨されます。最適な最小は2~3です:クリティカルなノーティフィケーション、一般的なもの、マーケティング用です。
Android 7.1(API 25)以下では、チャネルはサポートされていません。NotificationChannelクラスはAPI 26から利用可能です。下位互換性には、NotificationCompatを使用し、チャネル作成を条件で囲みます:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。