9

Utilizo una alarma para recuperar datos del servidor. Me gusta dar al usuario la opción de iniciar y detener la alarma. Esto significa que tengo que verificar y ver si la alarma ya está configurada. he encontrado un código que me dice si la alarma ya está establecido:Problema con Android AlarmManager al configurar y restablecer una alarma

Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_NO_CREATE); 
found = (P!=null); 

Si la alarma ya está establecido cancelo, pero si no se establece a continuación, lo fijo (como un conmutador)

El problema es que esto funciona solo una vez. La primera vez que el código anterior para comprobar las alarmas existentes devolverá NULL indica que no hay alarma, pero después de cancelar la alarma una vez que se devuelve un puntero a algo, pero la alarma no se está ejecutando.

Este es el código para fijar la alarma

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT); 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, P); 

y aquí está el código para cancelar una alarma:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT); 
am.cancel(P); 

soy yo para restablecer algo después de cancelar una alarma para que se PendingIntent desaparezca .

+1

No estoy realmente seguro de por qué se está realizando la comprobación para ver si una alarma ya existe. ¿Puedes explicar tu razonamiento por favor? –

+0

Quería tener un botón que actúe como un botón de activación/desactivación. También use el botón como indicador si la configuración de mi alarma se perdió debido a la falla de la aplicación. Uso la alarma para actualizar un widget cuando el usuario hace clic en el widget; abre una actividad en la que el usuario puede ver si la alarma está activada o no. Lo que me da miedo es que después de configurar la alarma, se apague y el usuario no sepa que está apagado. – Kemal

Respuesta

49

Al cancelar el AlarmManager no utilice un PendingIntent con un indicador de FLAG_CANCEL_CURRENT. En cambio, cancelar la PendingIntent explícitamente después de cancelar la alarma:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE); 
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class); 
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 
am.cancel(p); 
p.cancel(); 
+1

muchas gracias. p.cancel() ayudó aquí! – Karussell

+7

Debe marcar esto como la respuesta si lo ayudó. –

+1

Esto debería recibir 50 porque ninguno de los otros puestos address cancelar el 'PendingIntent' así como el' AlarmManager', y estoy usando '(PendingIntent.getBroadcast (getBaseContext(), 0, checkIntent, PendingIntent.FLAG_NO_CREATE)! = null); 'para verificar si mi alarma se está ejecutando y esto es lo único que funcionó sin reiniciar mi actividad. Gran trabajo. –

Cuestiones relacionadas