Многократное уведомление приложения с AlarmManager в разное время - PullRequest
0 голосов
/ 19 июня 2019

У меня есть таймер обратного отсчета. Скажем, он начинается через 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...