Androidの通知を実装してみました。
通知は下の手順で送信します。
- チャンネルの作成
- チャンネルの登録
- 通知の送信
チャンネルはAndroid 8.0から必須になったもので、通知のグループのようなものです。
ユーザーはチャンネルごとに通知をOFFにしたりする事ができます。
チャンネルは下のように生成します。
val channelId = "channelId" val channel = NotificationChannel(channelId, "チャンネルの名前", NotificationManager.IMPORTANCE_DEFAULT).apply { description = "チャンネルの説明文" }
生成したチャンネルはNotificationManagerを使って登録します。
一度登録すれば今後は登録しなくても通知を送る事ができます。
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager manager?.createNotificationChannel(channel)
登録したチャンネルの名前や説明文下のように表示されます。
チャンネルが複数ある場合、ユーザーの管理画面には下のように表示されます。
通知の送信処理は下の通りです。
NotificationCompat.Builderの第1引数にはContext(今回はActivity内なのでthisを使用)で第2引数には先程登録したチャンネルのIDを入れます。
val builder = NotificationCompat.Builder(this, "channelId") .setSmallIcon(androidx.core.R.drawable.notification_bg_normal) .setContentTitle("通知のタイトル") .setContentText("通知本文") NotificationManagerCompat.from(this).apply { notify(0, builder.build()) }
送った通知は下のように表示されます。
もし登録していないチャンネルIDを使った場合は下のような警告が出ます。
見た所、開発中のみ表示されるものかと思います。
この時、アプリは落ちないのですが通知も送られません。
通知ですがsetSmallIconだけは必ず付ける必要があります。
これがない場合は下のエラーが出てアプリが落ちます。
java.lang.IllegalArgumentException: Invalid notification (no valid small icon):
チャンネルはNotificationChannelの第3引数のImportanceを変える事で音を鳴らさない事などもできます。
また、音自体も変更する事が可能です。
登録したチャンネル一覧は下のように取得する事ができます。
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager manager?.notificationChannels?.forEach { Log.e("test", "${it.id}") }
また、登録した通知は下のように削除する事ができます。
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager manager?.deleteNotificationChannel(channelId)