[Android] Alarm をNotificationManager で通知する

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

notificationmanager_1
タイマー開始
notificationmanager_2
アラームを通知

Android Studio 2.1.3
Android 6.0

 

sponsored link

NotificationManager

 

  1. NotificationManagerで通知する
    • アイコンが表示され、通知をタップした時にバックグラウンドにいるならばMainActivityを立ち上げる
  2. 複数の繰り返しAlarm を PendingIntent で設定
    • アラームにIDを付けて、それぞれ個別に管理
  3. Alarm をキャンセルする
    • 繰り返しアラームをキャンセルする
 

1. NotificationManagerで通知する

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

 
NotificationCompat.Builder() を使ってアイコンや通知方法などを設定
 
notify() が最終的に表示させる設定です。
notify(int id, Notification notification)
 

 
複数の PendingIntent を処理するためにIntent に追加した requestID を取り出してPendingIntent.getActivity()に入れます。
 
また、通知からアプリを呼び出すために
Intent intent2 = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, bid, intent2, 0);
Notification.setContentIntent(pendingIntent)
を設定します。
 

 

2. 複数の PendingIntent

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

 
日時を指定したアラーム

 

 

3. Alarm cancel

 
繰り返しアラームが発生するため cancel させます
 

 

まとめ

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

 
MainActivity.java

 
AlarmBoradcastReceiver.java

 
activity_main.xml

 
Set ALARM 1 で5秒後に10秒間隔(正確ではありません)でアラームが発生
強制的に終了させ、バックグラウンドへ
アラームが発生、トースト、アイコンが表示され通知があることが分かります。

notificationmanager_1

notificationmanager_1b
notificationmanager_2
notificationmanager_1

通知をタップするとアプリが起動します。
 
Cancle Alarm 1 は
Alarm 1 の繰り返しアラームを取り消しします
 
Set Alarm 2 は時間(UTC)を指定してアラームが1回のみ発生します
 
notificationmanager_4