ともちゃんのアプリ開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA/Kotlin、iOSのSwiftUIを習得して行きます。ともちゃんの備忘録も兼ねています。

AlarmManagerを指定した時間に発火させる

Android 6.0以降、Dozeモードが導入されて、AlarmManagerも影響を受けるようになりました。

AlarmManagerを指定した時間に発火させるには、

  • Android 6.0(Marshmallow)以上:AlarmManger#setExactAndAllowWhileIdle()
  • Android 4.4(KitKat)以上:AlarmManger#setExact()
  • その他:AlarmManger#set()

を使い分ける必要があります。

AlarmManager alarmRegister = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmRegister.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmStartTime, alarmIntentRegister);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmRegister.setExact(AlarmManager.RTC_WAKEUP, alarmStartTime, alarmIntentRegister);
} else {
alarmRegister.set(AlarmManager.RTC_WAKEUP, alarmStartTime, alarmIntentRegister);
}

なお、AlarmManger#setExactAndAllowWhileIdle()には、

  1. 発火時の処理を10秒以内にする。
  2. 最短発火頻度は15分に1回

という制約があるそうです。