У меня есть таймер обратного отсчета.
Скажем, он начинается через 10 минут, пользователь закрывает приложение.
Я хочу предупредить их, когда осталось 5 минут, затем 1 минута и, наконец, когда не осталось времени.
В настоящее время я могу предупредить их, когда у них осталось 5 минут, но если я не открою приложение, следующий таймер не будет запущен. Когда я открываю приложение через 10 минут, следующее срабатывает, а через 1 минуту срабатывает последнее.
class NotificationAlarm : BroadcastReceiver() {
@SuppressLint("InvalidWakeLockTag")
override fun onReceive(context: Context, intent: Intent) {
val expired = intent.getIntExtra("Expired", 0)
val oneMinuteLeft= intent.getIntExtra("1min", 0)
val fiveMinutesLeft = intent.getIntExtra("5min", 0)
if (fiveMinutesLeft == 1) {
Utils.createNotification("You have 5 minutes before your time expires!", context)
setAlarm(context, System.currentTimeMillis() + (60000 * 1), "1min", 2)
}
if (oneMinuteLeft == 2) {
Utils.createNotification("You have 1 minute before your time expires!", context)
setAlarm(context, System.currentTimeMillis() + (60000 * 1), "Expired", 3)
}
if (expired == 3) {
Utils.createNotification("Your timer has expired", context)
}
}
fun setAlarm(context: Context, timeToGoOff : Long, intentExtra : String, intentExtraNum : Int) {
var am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val i = Intent(context, NotificationAlarm::class.java)
i.putExtra(intentExtra, intentExtraNum)
val pi = PendingIntent.getBroadcast(context, intentExtraNum, i, PendingIntent.FLAG_UPDATE_CURRENT)
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToGoOff, pi)
}
fun cancelAlarm(context: Context) {
val intent = Intent(context, NotificationAlarm::class.java)
val sender = PendingIntent.getBroadcast(context, 0, intent, 0)
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(sender)
}
// Singleton in Kotlin: https://medium.com/@adinugroho/singleton-in-kotlin-502f80fd8a63
private object Holder { val INSTANCE = NotificationAlarm() }
companion object {
private val TAG = NotificationAlarm::class.java.simpleName
val instance: NotificationAlarm by lazy { Holder.INSTANCE }
}
}
Чтобы установить это, я делаю это в другом классе, где я настраиваю таймер.
NotificationAlarm.instance.setAlarm(this, Calendar.getInstance().timeInMillis + (fiveMinutesBefore * 60000), "5min", 1)