どっこと備忘録群

アウトプットしないとインプットできない私が Androidアプリ開発をメインとした備忘録を載せています。

通知チャンネルを作成し、通知領域に通知を表示する

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

Android 8.0(Oreo / APIレベル26)以降、アプリから通知領域に通知を表示するためには、 その通知に対応する「通知チャンネル」をあらかじめ作成しておく必要があります。 通知チャンネルごとに重要度や音、バイブレーションの設定を管理することで、 ユーザーがチャンネル単位で通知の挙動をカスタマイズできるようになります。

通知チャンネル作成の手順

通知チャンネルは、以下の3つのステップで作成します。

  1. NotificationManager(または NotificationManagerCompat)のインスタンスを取得する。
  2. 通知チャンネルのインスタンスを生成する。
  3. NotificationManager に通知チャンネルの作成を登録する。

1. NotificationManagerのインスタンスを取得

通知の管理を担うインスタンスを取得します。 Jetpackライブラリ(androidx)では NotificationManagerCompat という互換クラスが提供されています。このクラスを利用することで、AndroidのOSバージョンを意識することなく安全に通知処理を実装できます。

インスタンスの取得は、以下のようにコンテキスト(Context)を渡して行います。

val manager = NotificationManagerCompat.from(this)

2. 通知チャンネルインスタンスを生成

作成する通知チャンネルの設定を定義します。 最小限の構成として、チャンネルID重要度(Importance)、ユーザーに表示されるチャンネル名(Name)が必要です。

val channel = NotificationChannelCompat.Builder("id", NotificationManagerCompat.IMPORTANCE_DEFAULT)
    .setName("ChannelName")
    .setDescription("ChannelDescription")
    .build()

重要度(Importance)の定義

実装時に重要となるImportance は、 NotificationManagerCompat に定義されている定数を参照して設定します。主に以下のレベルが用意されています。

  • NotificationManagerCompat.IMPORTANCE_MAX (最高レベルの重要度)
  • NotificationManagerCompat.IMPORTANCE_HIGH (音を鳴らし、画面にヘッドアップ通知を表示)
  • NotificationManagerCompat.IMPORTANCE_DEFAULT (音を鳴らす)
  • NotificationManagerCompat.IMPORTANCE_LOW (音を鳴らさない)
  • NotificationManagerCompat.IMPORTANCE_MIN (音を鳴らさず、ステータスバーにも表示しない)
  • NotificationManagerCompat.IMPORTANCE_NONE (通知をブロック)
  • NotificationManagerCompat.IMPORTANCE_UNSPECIFIED (重要度未設定)

3. NotificationManagerに通知チャンネルの作成を依頼

最後に、生成した通知チャンネルのオブジェクトを NotificationManagerCompat#createNotificationChannel() に渡すことで、 システムにチャンネルを登録します。

manager.createNotificationChannel(channel)

すでに同一のチャンネルIDで作成されている場合は、設定の更新、あるいは処理が無視されるため、アプリの起動時などに毎回呼び出しても安全です。

おまけ:通知チャンネルを削除する方法

作成した通知チャンネルが不要になった場合は、NotificationManagerCompat#deleteNotificationChannel(channelId) を呼び出すことで削除を依頼できます。

// 引数には作成時に指定した「チャンネルID」の文字列を渡します
manager.deleteNotificationChannel("id")

通知領域に通知を表示する

通知チャンネルの作成が完了したら、次は実際に通知を構築して表示する処理を実装します。 Android 13(APIレベル33)以降、通知の表示にはユーザーからの明示的な権限許諾が必要になったため、 パーミッションの要求処理も含めて解説します。

通知を表示する実装の流れ

  1. AndroidManifest.xml へパーミッションの追加
  2. 通知表示の権限許諾の確認と要求(拒否された場合のハンドリングを含む)
  3. 通知の構築と表示処理

1. AndroidManifest.xmlにパーミッションの追加

Android 13(APIレベル33)以降をターゲットとするアプリで通知を表示するには、 POST_NOTIFICATIONS 権限が必要です。AndroidManifest.xml に以下の宣言を追加します。

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

2. 通知表示の権限許諾確認

アプリ実行時にユーザーへ権限を要求します。 実装には registerForActivityResult を使用してランタイムパーミッションのランチャーを生成し、適切なタイミングで要求を実行します。

// 権限要求結果を受け取るランチャーの登録
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // 権限が許可された場合の処理
    } else {
        // 権限が拒否された場合の処理
    }
}

// 権限の確認と要求の実行
private fun checkNotificationPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        when {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.POST_NOTIFICATIONS
            ) == PackageManager.PERMISSION_GRANTED -> {
                // 既に権限が許可されている場合は通知を表示できる
            }
            shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS) -> {
                // 過去に拒否されたことがある場合:
                // ダイアログ等で通知が必要な理由を説明した上で、再度ランチャーを起動する
            }
            else -> {
                // 初回要求、または「今後表示しない」を選択されていない場合
                requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
            }
        }
    }
}

拒否された時の再許諾確認(Rationale)

shouldShowRequestPermissionRationaletrue を返した場合は、ユーザーが一度権限を拒否したことを意味します。 この段階では、いきなりシステムダイアログを再表示するのではなく、「なぜこのアプリに通知権限が必要なのか(例:重要なリマインドを届けるため等)」をアプリ独自のUIで説明し、納得してもらった上で再度要求を行うフローが推奨されます。


3. 通知の構築と表示処理

権限が確保されていることを確認した上で、NotificationCompat.Builder(または Notification.Builder)を使用して通知を作成し、NotificationManagerCompat で表示をシステムに依頼します。

if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
    
    // 通知オブジェクトの構築
    val notification = NotificationCompat.Builder(this, "CHANNEL_ID")
        .setContentTitle("ここにタイトルを表示")
        .setSmallIcon(R.mipmap.ic_launcher) // 必須:通知エリアに表示されるアイコン
        .setContentText("ここに通知の本文テキストを表示")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .build()
        
    // 通知の表示実行
    NotificationManagerCompat.from(this).apply {
        // notificationId(第2引数)は通知を識別する任意の一意の数値
        notify(1, notification)
    }
}

正しく実装されると、デバイスの通知領域に指定したタイトルとテキスト、アイコンを持った通知が表示されます。

通知チャンネルの設定画面を表示する

Android 8.0(APIレベル26)以降で導入された通知チャンネルですが、 アプリ側から直接、設定値(音、バイブレーション、重要度など)を変更することはできません。 アプリが提供できる操作は、チャンネルの作成と削除のみに制限されています。

そのためユーザーが設定を変更できるようにするには、 アプリ内から端末の通知チャンネル設定画面へ直接遷移する導線を設ける必要があります。

実装方法

アプリが作成した特定の通知チャンネルの設定画面へ直接遷移するには、以下のコードを実装します。

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

通常の startActivity と同様に、 適切なインテントアクション(ACTION_CHANNEL_NOTIFICATION_SETTINGS)を指定し、アプリのパッケージ名と対象のチャンネルIDをパラメータとして渡すことで、該当する設定画面を直接開くことができます。

注意: > ACTION_CHANNEL_NOTIFICATION_SETTINGS を使用する際は、EXTRA_CHANNEL_ID だけでなく EXTRA_APP_PACKAGE の指定も必須となります。

参考

最終更新: 2026.6.10