2016-06-29 3 views
0

У меня есть повторяющийся сигнал тревоги в верхней части каждого часа, чтобы проверить, нужно ли отправлять уведомление. У меня есть кнопки включения/выключения, но выключение не отменяет его. Существует довольно много вопросов об отмене аварийных сигналов на SO, но ни один из них не смог помочь. Вот что у меня есть.Как отменить повторный сигнал тревоги

Основная деятельность

public void onSendNotificationsButtonClick(View view) { 
    NotificationEventReceiver.setupAlarm(getApplicationContext()); 
} 

public void stopSendNotificationsButtonClick(View view) { 
    NotificationEventReceiver.cancelAlarm(getApplicationContext()); 
} 

приемник Event расширяет WakefulBroadcastReceiver

public static void setupAlarm(Context context) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent alarmIntent = getStartPendingIntent(context); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
      getTriggerAt(new Date()), 
      NOTIFICATIONS_INTERVAL_IN_HOURS * AlarmManager.INTERVAL_HOUR, 
      alarmIntent); 
} 

public static void cancelAlarm(Context context) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent alarmIntent = getDeleteIntent(context); 
    alarmIntent.cancel(); 
    alarmManager.cancel(alarmIntent); 
} 

private static long getTriggerAt(Date now) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(now); 
    calendar.add(Calendar.HOUR, NOTIFICATIONS_INTERVAL_IN_HOURS); //change here to set notification interval 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    return calendar.getTimeInMillis(); 
} 

private static PendingIntent getStartPendingIntent(Context context) { 
    Intent intent = new Intent(context, NotificationEventReceiver.class); 
    intent.setAction(ACTION_START_NOTIFICATION_SERVICE); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

public static PendingIntent getDeleteIntent(Context context) { 
    Intent intent = new Intent(context, AlarmManager.class); 
    intent.setAction(ACTION_DELETE_NOTIFICATION); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    Intent serviceIntent = null; 
    if (ACTION_START_NOTIFICATION_SERVICE.equals(action)) { 
     Log.i(getClass().getSimpleName(), "onReceive from alarm, starting notification service"); 
     serviceIntent = NotificationIntentService.createIntentStartNotificationService(context); 
    } else if (ACTION_DELETE_NOTIFICATION.equals(action)) { 
     Log.i(getClass().getSimpleName(), "onReceive delete notification action, starting notification service to handle delete"); 
     serviceIntent = NotificationIntentService.createIntentDeleteNotification(context); 
    } 

    if (serviceIntent != null) { 
     // Start the service, keeping the device awake while it is launching. 
     startWakefulService(context, serviceIntent); 
    } 
} 

редактировать: Изменены функции на основе ответов, по-прежнему не отменяет тревогу.

public static void cancelAlarm(Context context) { 
    Intent intent = new Intent(context, NotificationServiceStarterReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(sender); 
} 
+0

Возможный дубликат [Как отменить эту повторяющуюся тревогу?] (Http://stackoverflow.com/questions/3330522/how-to-cancel-this-repeating-alarm) –

ответ

0

Оно должно быть:

public static void cancelAlarm(Context context) { 
Intent intent = new Intent(this, AlarmReceive.class); 
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.cancel(sender); 
} 

В этой статье: How to cancel this repeating alarm?

+0

Я видел эта статья, и это не работает, см. мое редактирование. – Drakorex

0

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

public static void cancelAlarm(Context context) { 
    Intent intent = new Intent(this, AlarmReceive.class); 
    PendingIntent sender = PendingIntent.getBroadcast(this, request_code, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.cancel(sender); 
    sender.cancel(); } 
0
Please try this 

public void cancelAlarmIfExists(Context mContext, int requestCode, Intent intent) { 
    try { 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, 0); 
     AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
     am.cancel(pendingIntent); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

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

  • Нет связанных вопросов^_^