es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué mi alarmmanager no se activa a la hora especificada?

La función setAlarm se llama cada vez que presiono un botón. Cada vez que lo hago, el mensaje “test” aparece 5 segundos después sin importar qué. Cambiar el segundo parámetro de .setExact() no parece afectar cuándo se activa la alarma.

Método setAlarm en MainActivity

private fun setAlarm (cal : Calendar){
        val alarmManager :AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent (this, AlertReceiver().javaClass)
        val pendingIntent : PendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0)
        //
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, 100000, pendingIntent)
}

AlertReceiver

class AlertReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Toast.makeText(context, "test", Toast.LENGTH_SHORT).show()
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar con el segundo parámetro del método alarmManager.setExact(). Actualmente, está codificado como 100000, lo que hace que la alarma suene después de 5 segundos sin importar qué. Necesita ser reemplazado por el tiempo en milisegundos desde el tiempo actual en el que la alarma debería sonar.

    Para solucionar el problema, necesitamos calcular la diferencia de tiempo entre el tiempo actual y el tiempo establecido, en milisegundos, y pasar ese valor como segundo parámetro para el método alarmManager.setExact(). Esto se puede hacer utilizando el método getTimeInMillis() de la clase Calendar, que devuelve el tiempo en milisegundos.

    Aquí está el método setAlarm actualizado:

    private fun setAlarm (cal : Calendar){
        val alarmManager :AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent (this, AlertReceiver().javaClass)
        val pendingIntent : PendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0)
        //
        val timeInMillis = cal.timeInMillis - System.currentTimeMillis()
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pendingIntent)
    }
    

    Ahora, la alarma sonará en el tiempo establecido, siempre que la diferencia de tiempo entre el tiempo actual y el tiempo establecido sea mayor a 5 segundos (que era el retraso codificado previamente).

Comments are closed.