Eliminar alarma de AlarmManager con cancelar () – Android

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

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

Aquí está mi addAlarm() :

 AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(PROX_ALERT_INTENT); intent.putExtra("ALERT_TIME", alert.date); intent.putExtra("ID_ALERT", alert.idAlert); intent.putExtra("TITLE", alert.title); intent.putExtra("GEO_LOC", alert.isGeoLoc); PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alert.idAlert, intent, PendingIntent.FLAG_CANCEL_CURRENT); Calendar calendar = Calendar.getInstance(); calendar.setTime(alert.date); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Log.e("ADD ALERT - WithoutGeoLoc - ",alert.toString()); 

Aquí está mi método deleteAlarm ():

 AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(PROX_ALERT_INTENT); intent.putExtra("ALERT_TIME", alert.date); intent.putExtra("ID_ALERT", alert.idAlert); intent.putExtra("TITLE", alert.title); intent.putExtra("GEO_LOC", alert.isGeoLoc); PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alert.idAlert, intent, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.cancel(pendingIntent); Log.e(TAG,"REMOVE ALERT - without GeoLoc"+alert.toString()); 

Aquí está mi Logcat:

 01-23 17:44:07.411: E/ADD ALERT - WithoutGeoLoc -(18789): Alert [latitude=0.0, longitude=0.0, title=bfwu, comments=null, address=null, currency=hrk, idAlert=1, date=Sat Feb 23 17:44:04 CET 2013, isGeoLoc=null] 01-23 17:44:13.032: E/REMOVE ALERT without GeoLoc - (18789): Alert [latitude=0.0, longitude=0.0, title=bfwu, comments=null, address=null, currency=hrk, idAlert=1, date=Sat Feb 23 17:44:04 CET 2013, isGeoLoc=null] 

Aquí hay una lista de pendientes en el AlarmManager

 Current Alarm Manager state: Realtime wakeup (now=2013-01-23 17:44:37): RTC_WAKEUP #48: Alarm{2c1d0588 type 0 com.my.app} type=0 when=+364d23h59m33s288ms repeatInterval=0 count=0 operation=PendingIntent{2c0a6cb0: PendingIntentRecord{2c1d04e8 com.my.app broadcastIntent}} RTC_WAKEUP #47: Alarm{2c2298a0 type 0 com.my.app} type=0 when=+30d23h59m27s360ms repeatInterval=0 count=0 operation=PendingIntent{2c292af8: PendingIntentRecord{2c22a628 com.my.app broadcastIntent}} 

Un par de notas:

  • RTC_WAKEUP #47 es mi alarma original
  • RTC_WAKEUP #48 es una nueva alarma que debería haber sobrescrito # 47 en lugar de crear una nueva.

He comparado los dos bashs (no elementos pendientes) de mis métodos de agregar y eliminar utilizando el método filterEquals() Intent que devuelve true … Sin embargo, la alarma no se elimina. ¿Qué estoy haciendo mal?


ACTUALIZAR

Aquí está mi método saveAlert() que llama a addAlarm() y deleteAlarm()

 private void saveAlert() { // *** If Modifying Alert => REMOVE OLD ALERT (then add new one) Intent intent1 = null, intent2 = null; if (alert.idAlert != null) { if (alert.isGeoLoc == null || alert.isGeoLoc == false) { intent2 = ProximityService.removeProximityAlertWithoutGeoLoc(getApplicationContext(), devisesApp.alertsGlobal.getAlertById(alert)); } else { ProximityService.removeProximityAlert(getApplicationContext(), alert); } } // *** Add Alert if (alert.isGeoLoc == null || alert.isGeoLoc == false) { intent1 = ProximityService.addProximityAlertWithoutGeoLoc(getApplicationContext(), alert, devisesApp.alertsGlobal); } else { ProximityService.addProximityAlert(getApplicationContext(), alert, devisesApp.alertsGlobal); } Log.i(TAG, "[saveAlert] Alert ID : " + alert.idAlert); devisesApp.alertsGlobal.addById(alert); Log.i("INTENT EQUALS", intent1.filterEquals(intent2) + ""); // This returns true } 

Prueba esta bandera:

 PendingIntent.FLAG_UPDATE_CURRENT 

En lugar de:

 PendingIntent.FLAG_CANCEL_CURRENT 

Entonces PendingIntent se verá así:

 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alert.idAlert, intent, PendingIntent.FLAG_UPDATE_CURRENT) 

(¡Asegúrate de usar el mismo objeto de alert y mContext !)

Una nota al margen: si quiere un AlarmManager global, coloque el AlarmManager en una variable estática (e inicialícelo solo si es null ).

Cancelar una alarma es un poco confuso. Tienes que pasar el mismo ID e IntentPending. Aquí hay un ejemplo:

 private void resetIntentWithAlarm(int time){ Intent intentAlarm = new Intent(getApplicationContext(), DownloadService.class); intentAlarm.putExtra(Your Key, Your stuff to pass here); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService( getApplicationContext(), YOUR_ID, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT ); if (time != 0) { alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (60L * 1000L * time), (60L * 1000L * time), pendingIntent); Log.i(TAG, "Alarm setted on for " + time + " mins."); } // if TIME == Zero, cancel alaram else { alarmManager.cancel(pendingIntent); Log.i(TAG, "Alarm CANCELED. Time = " + time); } 

Si desea cancelar el administrador de alarma, simplemente coloque el ID Wright en el bash pendiente y simplemente llame a cancel () en el administrador de alarmas para ese bash pendiente.