Intereting Posts

Удалить будильник из AlarmManager с помощью функции cancel () – Android

Я пытаюсь создать и удалить сигнал тревоги двумя разными способами, которые вызываются в разные моменты времени в приложении. логика.

Однако, когда я вызываю метод cancelManager AlarmManager, сигнал тревоги не удаляется.

Вот мой метод addAlarm ():

 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 alarmManager = (AlarmManager) mContext .getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTime(alert.date); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Log.e("ADD ALERT - WithoutGeoLoc - ",alert.toString()); 

Вот мой метод 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()); 

Вот мой 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] 

Вот список ожидающих запросов в 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}} 

RTC_WAKEUP # 47 => My Original Alarm RTC_WAKEUP # 48 => Новый сигнал, который должен был перезаписать # 47, а не создать новый.

Я сравнил два намерения (Not pendingIntents) с моими методами добавления и удаления с использованием метода filterEquals() метода Intent, который возвращает true. Однако будильник не удаляется. Что я делаю не так?

* ОБНОВЛЕНИЕ

Вот мой метод saveAlert (), который вызывает addAlarm () и 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 } 

Solutions Collecting From Web of "Удалить будильник из AlarmManager с помощью функции cancel () – Android"

Попробуйте этот флаг:

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

Вместо:

 PendingIntent.FLAG_CANCEL_CURRENT 

Убедитесь, что вы используете тот же объект оповещения и mContext.

Если вы хотите один глобальный AlarmManager, поставьте AlarmManager в статическую переменную (и инициализируйте ее только в том случае, если она равна null).

Отмена сигнала тревоги немного запутанна. Вы должны передать тот же идентификатор и IntentPending. Вот пример:

 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); } 

Если вы хотите отменить диспетчер аварийных сигналов, просто установите идентификатор ошибки в ожидании намерения и просто отмените отмену () в диспетчере аварийных сообщений для этого ожидающего намерения.