Cómo cancelar la alarma desde AlarmManager

3 minutos de lectura

Avatar de usuario de Vladimir Homola
vladimir homola

Me he encontrado con el mismo problema como este. Eliminar alarma de AlarmManager usando cancel() – Android

“Estoy tratando de crear y eliminar una alarma en dos métodos diferentes que se llaman en diferentes momentos en la lógica de la aplicación.

Sin embargo, cuando llamo al método cancel() de AlarmManager, la alarma no se elimina”.

Para configurar:

            Intent myIntent = new Intent(getApplicationContext(),
                    SessionReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    getApplicationContext(), 1, myIntent, 0);

            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

            alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(),
                    pendingIntent);

Para borrar:

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent myIntent = new Intent(getApplicationContext(),
            SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.cancel(pendingIntent);

Pero esto no elimina una alarma registrada. Gracias por adelantado.

Avatar de usuario de Daniel Nugent
daniel nugent

El PendingIntent debe crearse exactamente como estaba cuando inició AlarmManager, y parece que el problema principal es que está utilizando un código de solicitud diferente (cero en lugar de uno).

Para una solución rápida, esto debería funcionar:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                 getApplicationContext(), 1, myIntent, 0);

alarmManager.cancel(pendingIntent);

Para usar PendingIntent.FLAG_UPDATE_CURRENT bandera, ver abajo:

Entorno:

Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                getApplicationContext(), 1, myIntent, 
                                PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(), pendingIntent);

Cancelado:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                getApplicationContext(), 1, myIntent, 
                                PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager.cancel(pendingIntent);

  • Vaya. Veo el problema. ¡Debería haber usado el mismo código de solicitud! Muchas gracias por su ayuda,

    -Vladimir Homola

    9 de marzo de 2015 a las 3:39


  • ¿Pueden ayudarme a resolver stackoverflow.com/questions/51542099/… @DanielNugent

    – Zhu

    26 de julio de 2018 a las 15:25

  • por qué Google no implementó es como AlarmManager.cancel(int requestCode) ? Luego, el sistema operativo maneja el resto de los detalles subyacentes, como el espacio de nombres de la aplicación. Ciertamente sería una API más fácil de usar

    – Alguien en algún lugar

    6 de noviembre de 2018 a las 13:14

  • Entonces, ¿básicamente el código de solicitud es un identificador de la alarma?

    – Mitulát bati

    2 abr 2019 a las 20:43

  • No: requestCode no es el identificador de la alarma. El PendingIntent es el identificador, y requestCode es parte de los accesorios clave de PendingIntent (junto con el propio Intent subyacente, que tiene sus propias claves de identificación).

    – gabriel

    7 de junio de 2019 a las 13:18

Inicialmente, para mí tampoco funcionó, después de ver muchas publicaciones, me di cuenta de que la intención pendiente de cancelar debería ser la misma que la intención pendiente original que se usó para programar la alarma. La intención pendiente de cancelar debería haberse configurado en la misma acción y los mismos campos de datos, si se usaron para configurar la alarma. Después de configurar los mismos valores de ACCIÓN y datos, aunque no los estoy usando, solo canceló la alarma.

  • Esto funcionó para mí. Estaba usando FLAG_ONE_SHOT para pendiente mientras configuraba la alarma y FLAG_UPDATE_CURRENT cuando la cancelaba. Reemplazar FLAG_UPDATE_CURRENT con FLAG_ONE_SHOT (que se usó mientras se configuraba la alarma) para cancelar dio el resultado deseado

    -Trupti Nasit

    4 de mayo de 2022 a las 7:13


¿Ha sido útil esta solución?