Androidアプリ開発で、つまずいた所があったのでメモ。
転載元
当記事は以下ブログからの転載です。
TECH BACK
はじめに
リマインドのために、ステータスバーに通知を定期的に表示してるんですが、Android9で表示できず。。。
こちらの本を参考に、通知機能を実装しました。
通知機能自体も、こちらの本のコードを参考に構築しました。
Androidアプリ開発は、この手の事象は多く発生するだろうな~これからも。
Androidのバージョン一覧
先におさらいをしておくと、
下記の表のようにAndroidバージョンがあるんですが、それぞれAPIレベルとコードネームがあります。
皆さんも困ったときにググって、それを参考に対応することもあるかと思いますが、Androidバージョンで語っていたり、APIレベル・コードネームだったり、まちまちなんですよね。そんな時は、この表を思い出してください。
今回は、Android9で動かなかったので、Android9 API28 に対応していく必要があります。
Android | API | コードネーム |
---|---|---|
Android 4.4 | 19 | KITKAT |
Android 5 | 21 | LOLLIPOP |
Android 6 | 23 | MARSHMALLOW |
Android 7 | 24 | NOUGAT |
Android 8 | 26 | OREO |
Android 9 | 28 | PIE |
Android 10 | 29 | Q |
やはり公式ドキュメント
今回対応したい、通知に関する公式ドキュメントは、こちらですね。
「Android 8.0以上では、、、」と、数カ所記載があります。
Android 8.0以上とそれ以前のバージョンで、大きな違いがあるようです。
気になる記載としては、
Android 8.0 以上では、通知を送信する前に通知チャネルを作成する必要があるため、アプリが起動したらすぐにこのコードを実行する必要があります。
既存の通知チャネルを作成してもオペレーションは実行されないので、これを繰り返し呼び出しても問題ありません。
多分これじゃないでしょうか。
対応内容
公式ドキュメントにあるとおり、
「通知チャンネルを作成する必要がある」
ってことですね。作りましょう!
実装コード
これは、公式ドキュメントにそのままのものがあるので、それを既存コードに追記していくことになります。
nameとdescriptionTextは、取得しているコードになっていますが、私はリテラルで指定してしまいました。
private fun createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = getString(R.string.channel_name)
val descriptionText = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
description = descriptionText
}
// Register the channel with the system
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
実装する場所
Activityを継承しているClassだったら、どれでも大丈夫かと思うんですが、
「アプリが起動したらすぐにこのコードを実行する必要があります。」
なんて記載がありますので、MainActivityで実装しておけばOK。
そして、createNotificationChannel を onStart()で呼び出しました。