应用随时间变化的AlarmManager进行多个通知

时间:2019-06-19 03:04:09

标签: java kotlin

我有一个倒数计时器。 假设从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)

0 个答案:

没有答案