![サバ缶](https://tech-begin.com/wp-content/uploads/2021/08/cropped-profile_icon.png)
どうもこんにちは!
サバ缶(@tech_begin)です。
とある業務で、ローカルプッシュ通知を実装しました。
個人的に初めてのことで、若干時間がかかった部分でしたので備忘録としてまとめます。
ローカルプッシュ通知とは?
一般的なプッシュ通知は、「今日のおすすめ動画はこちら!」とか見慣れたアレのことです。
プッシュ通知を受け取るスマホの「デバイス識別番号」をサーバ側に登録します。
そして、その識別番号を使って、端末を特定し、条件にあったユーザにプッシュ通知を送ることが可能です。
例えば、「●●さんからメッセージが来ています!」とかですね。
それらは、サーバが動作して、各スマホに送信しています。
しかし、ローカルプッシュ通知はスマホ内で、好きなタイミングでプッシュ通知を送ることが出来ます。
Android でのローカルプッシュ通知実装
必要最低限の実装は、以下をご参照いただければ可能です。
![サバ缶](https://tech-begin.com/wp-content/uploads/2021/08/cropped-profile_icon.png)
そのまんま載っけます!
ちなみに、言語はKotlinです。
// ①インテントの作成
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
// ②通知の準備
val channelId = "NOTIFICATION_LOCAL"
val builder = NotificationCompat.Builder(this, channelId).apply {
setSmallIcon(R.drawable.smallIcon)
setContentTitle("通知タイトル")
setContentText("通知内容")
setContentIntent(pendingIntent)
priority = NotificationCompat.PRIORITY_HIGH
}
// ③チャネルの設定
// Android8(API26)以上の場合、チャネルに登録する
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "通知名サンプル"
val description = "通知説明文サンプル"
val importance = NotificationManager.IMPORTANCE_HIGH
val channel = NotificationChannel(channelId, name, importance).apply {
this.description = description
}
// システムにチャネルを登録する
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel)
}
// ④ローカルプッシュ通知を送信する
with(NotificationManagerCompat.from(this)) {
notify(12345, builder.build())
}
コードの内容を解説
①インテントの作成
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
ローカルプッシュ通知をタップした時に、遷移するための処理を記述します。
通常のIntentではなく「PendingIntent」というものを使用します。
PendingIntentは、外部アプリ(実装したアプリ以外のもの)に与えることで、他のアプリも自分自身のアプリのように動作させることができます。
今回で言えば、ローカルプッシュ通知なので、Androidのホームアプリとの連携という意味になります。
②通知の準備
val channelId = "NOTIFICATION_LOCAL"
val builder = NotificationCompat.Builder(this, channelId).apply {
setSmallIcon(R.drawable.smallIcon)
setContentTitle("通知タイトル")
setContentText("通知内容")
setContentIntent(pendingIntent)
priority = NotificationCompat.PRIORITY_HIGH
}
NotificationCompatのビルダーを使って、文言やアイコンなどを設定します。
priority は、通知の優先度を設定するものです。
詳細は、公式ドキュメントをご参照ください。
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/7d1534ca28dbc9acc40b905a3c4b2a64.png)
③チャネルの設定
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "通知名サンプル"
val description = "通知説明文サンプル"
val importance = NotificationManager.IMPORTANCE_HIGH
val channel = NotificationChannel(channelId, name, importance).apply {
this.description = description
}
// システムにチャネルを登録する
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager manager.createNotificationChannel(channel)
}
Android8以上では、「アプリの通知チャネル」という機能が搭載されています。
そのシステム側への登録が必要になります。
ユーザが細かい通知の設定をできる機能です。
メッセージの通知はOFFにして、通話の通知はONにしよう…のように各通知を切り替えることできます。
ちなみに、Android 13以降では通知のリクエストを行う必要があります。
Android 12までは、デフォルトで権限がONになっていたものが、OFFになるようです。
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/7d1534ca28dbc9acc40b905a3c4b2a64.png)
④ローカルプッシュ通知を送信
with(NotificationManagerCompat.from(this)) {
notify(12345, builder.build())
}
あとは、ビルダーを使ってプッシュ通知を送信します。
「12345」というのは、チャネルの番号です。任意で書き換えてください。
【補足】Kotlinの構文について
applyを使うと便利です!
一時変数の記載が不要になるので、コードがとても簡略化できます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9S290bGluJUUzJTgxJUE3JUUzJTgyJUI5JUUzJTgyJUIzJUUzJTgzJUJDJUUzJTgzJTk3JUU5JTk2JUEyJUU2JTk1JUIwJUUzJTgwJThDYXBwbHklRTMlODAlOEQlRTMlODIlOTIlRTQlQkQlQkYlRTMlODElODglRTMlODElQjAlRTMlODAlODElRTQlQjglODAlRTYlOTklODIlRTUlQTQlODklRTYlOTUlQjAlRTMlODIlOTIlRTYlOUIlQjglRTMlODElOEIlRTMlODElQUElRTMlODElOEYlRTMlODElQTYlRTMlODElOTklRTMlODIlODAlRTMlODElQUUlRTUlQjclQkImdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPWE5MTBhZDhiZWMwNzg4NDM4YmNiZTE0OGI0NGI0M2Ji&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB3YWt3YWsmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWY4ODg3MzVkZDhjN2I1M2VmYmMyMDYxZTk1MTI2ZDM2&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4g5qCq5byP5Lya56S-44Kr44K144Os44Ki44Or&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%231E2121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=7d9e98f9d5e9b23e3f04a138df68901c)
【補足】長文の通知をスライドして表示させる
![](https://tech-begin.com/wp-content/uploads/2022/07/OL風の人物アイコン.png)
あれ?
さっきのコードだと、通知が全文表示されないです……。
そんな時は、以下の処理を加えると対応可能です。
.setStyle( NotificationCompat.BigTextStyle()
.setBigContentTitle("スライドして全文表示した時のタイトル")
.bigText("全文表示した時の全文(基本的にはsetContentsと同じ文章)")
)
参考記事
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/7d1534ca28dbc9acc40b905a3c4b2a64.png)
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/7d1534ca28dbc9acc40b905a3c4b2a64.png)
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/826ddd244d633277d168b815aaa15114.png)
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/e1cc7b6c079a3f73303f51df5319c4b3.png)