Intereting Posts
Круглые края Android на кольцевой панели прогресса Зачем использовать Enums вместо констант? Отключить кнопку возврата в android Как разместить Google Maps V2 на фрагменте с помощью ViewPager Получить список контактов и статус skype в android Как указать различные макеты для портретной и альбомной ориентации? Как установить шрифт для меню «Параметры»? Как получить кнопку «Далее» на экранной клавиатуре Android вместо кнопки «Go» в телефонной запинке OnSaveInstanceState не сохраняет мои значения (onCreate input Bundle всегда равно null) Можно ли использовать adb.exe для поиска описания телефона? Самый эффективный способ показать анимацию по кадру за кадром Android создает папки во внутренней памяти Почему функция getBackStackEntryCount () возвращает значение FragmentManager? Следующие классы не могли быть созданы: – android.support.v7.widget.Toolbar CertPathValidatorException: Trust anchor для пути сертификации не найден

Удалить будильник из 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); } 

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