2016-06-29 77 views
0

我每小时都会有重复闹钟,以检查是否需要发送通知。我有开/关按钮,但关闭似乎不会取消它。关于取消SO报警有几个问题,但没有人能够帮助。这是我的。如何取消重复闹钟

主要活动

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

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

事件接收器扩展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(); 
    } 
}