しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Kotlin】Androidで通知を送る

Androidの通知を実装してみました。

通知は下の手順で送信します。

  1. チャンネルの作成
  2. チャンネルの登録
  3. 通知の送信

チャンネルは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)

参考URL

通知を作成する  |  Android デベロッパー  |  Android Developers

[kotlin] コピペでandroidに通知を出す - Qiita