[Android] Alarm をNotificationManager で通知する

前回は AlarmManger タイマー機能 でアラームを発生し BroadcastReceiver で受け取りました。今回は、その受け取ったアラームを NotificationManager を使って通知してみたいと思います。
 

Android Studio 3.0.1
Android 8.1.0

 



NotificationChannel

 
Notification、つまり通知ですが「メールが届きました」などの通知がStatus barや通知ドロワーに表示されるものです。
 

 

 
同時に通知音やバイブレータでユーザーにお知らせする機能です。
 
API level 26からは NotificationChannel が追加されました。アプリの通知のプライオリティを設定することができます。

また、アイコンに通知があった場合に通知ドットをつけることができます。いわゆるバッジです。また長押しするとメッセージをダイアログで出したりと色々とChannelで設定することができます。
 

 

 

NotificationManager

 
BroadcastReceiverを継承したクラスの onReceive() でアラームを受け取り通知する設定です。
 
NotificationManager:
インスタンスは getSystemService() を使って以下のように生成

 

NotificationChannel: 

必ずしも全て必要ではありませんので選択できます。

NotificationCompat.Builder:
Notification.Builder(Context context)は非推奨になりました。代わりにchannel IDを引数として使っていきます。

 
例えばこのように設定します。

 
notify() が最終的に表示させる設定です。
notify(int id, Notification notification)

 

繰り返しAlarm を PendingIntent で設定

 
1分毎のアラームの繰り返しを設定してみます。数十秒での繰り返しはsetRepeatingでは難しくなっています。

BroadcastReceiver でそれぞれを区別するために受け取るためにgetBroadcast() 第二引数、requestCode を設定して Intent に追加して送ります。
 
setRepeating() を使って繰り返してアラームを発生させます
 
Android 19 以降では set(), setRepeating() の精度は正確ではなくなりましたので注意です。setRepeating() の誤差とsetExact() setWindow()、差分が大きいときもあります。

 

アラームをキャンセル

 
繰り返しアラームが発生するため cancel 機能がないと困ります。
登録したものと同じIntentとPendingIntentからAlarmManagerを設定して
cancel(pending)を呼び出して解除します。
 

 

サンプルコード

 
コードをまとめてみます
 
AndroidManifest.xml

 
MainActivity.java

 
AlarmBoradcastReceiver.java

 
activity_main.xml

 
strings.xml

 

 
 
References:
NotificationChannel | Android Developers
GitHub – googlesamples/android-NotificationChannels
Notification.Builder | Android Developers