2013-05-14 3 views
1

Я имею установку alarmManager следующим образом:Как отменить AlarmManager

Intent intent = new Intent(TopActivity.this, RecordActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength); 
    intent.putExtra(Utils.KEY_REC_START_TIME, start); 

    saveTimeAndLength(start, recordLength); 

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0); 
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent); 

Ниже предполагается отменить его, но он всегда терпит неудачу. Что мне не хватает?

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(TopActivity.this, RecordActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
intent.putExtra(Utils.KEY_RECORD_TIME, start); 
intent.putExtra(Utils.KEY_REC_START_TIME, recordLength); 

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0); 
try { 
    alarmManager.cancel(pintent); 
    Log.e(TAG, "Cancelling all pending intents"); 
} catch (Exception e) { 
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); 
} 

Я прочитал много ответов на StackOverflow, но до сих пор не мог понять, в чем проблема.
Заранее благодарим!

+0

Кто-то уже упоминалось о том, что дополнительные ключи данных инвертируются (начало и Recordlength)? 'Intent.putExtra (Utils.KEY_RECORD_TIME, Recordlength) ; intent.putExtra (Utils.KEY_REC_START_TIME, начало); 'vs.' intent.putExtra (Utils.KEY_RECORD_TIME, начало); intent.putExtra (Utils.KEY_REC_START_TIME, recordLength); '- он не должен вызывать проблемы с фильтрацией, хотя ... – Johannes

ответ

2

Я отправлю свой ответ здесь в надежде, что это поможет другим экономить время.
Как-то добавить флаг PendingIntent.FLAG_UPDATE_CURRENT в обе стороны решить проблему.

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); 

решена проблема.
Установка сигнализации

Intent intent = new Intent(TopActivity.this, RecordActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength); 
    intent.putExtra(Utils.KEY_REC_START_TIME, start); 

    saveTimeAndLength(start, recordLength); 

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent); 

Отменить Alarm

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(TopActivity.this, RecordActivity.class); 

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
try { 
    alarmManager.cancel(pintent); 
    Log.e(TAG, "Cancelling all pending intents"); 
} catch (Exception e) { 
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); 
} 
0

Вам нужно создать свой отложенный намерение, а затем отменить его

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

Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class); 
PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0); 

// Cancel alarms 
try { 
    alarmManager.cancel(pendingUpdateIntent); 
} catch (Exception e) { 
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); 
} 
+0

Я думаю, что я делаю то же самое! –

2

Для AlarmManager отменить событие, необходимо сравнить два Намерения.

Это достигается за счет filterEquals (другой Намерение) метод, который говорит

Определить, если два намерения являются одинаковыми для целей разрешения намерения (фильтрации). То есть, если их действие, данные, тип, класс, и категории одинаковы. Это не сравнивает никаких дополнительных данных , включенных в намерения.

Я не уверен, почему это не совпадает, когда класс такой же.

У меня тоже была такая же проблема, чтобы преодолеть это, я также установил данные.

Посмотрите, поможет ли это.

EDITED

при настройке сигнализации

Intent intent = new Intent(TopActivity.this, RecordActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    intent.putExtra(Utils.KEY_RECORD_TIME, recordLength); 
    intent.putExtra(Utils.KEY_REC_START_TIME, start); 
    intent.setData(Uri.fromParts("yourappscheme", "alarm", null)); 
    saveTimeAndLength(start, recordLength); 

    PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0); 
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent); 

И когда нужно отменить

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(TopActivity.this, RecordActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
intent.putExtra(Utils.KEY_RECORD_TIME, start); 
intent.putExtra(Utils.KEY_REC_START_TIME, recordLength); 
intent.setData(Uri.fromParts("yourappscheme", "alarm", null)); 

PendingIntent pintent = PendingIntent.getActivity(TopActivity.this, 0, intent, 0); 
try { 
    alarmManager.cancel(pintent); 
    Log.e(TAG, "Cancelling all pending intents"); 
} catch (Exception e) { 
    Log.e(TAG, "AlarmManager update was not canceled. " + e.toString()); 
} 
+0

Можете ли вы дать мне представление о том, как вы преодолеете свою проблему. Все, что я делаю, похоже, не работает. @ Vivek Khandelwal Я даже сохранил намерение, которое я установил в тревоге, и отменил его, но он не работает. –

+0

Я havent попробовал ваш метод, как-то добавляя флаг PendingIntent.FLAG_UPDATE_CURRENT решил мою проблему. Довольно странно! –

Смежные вопросы