Wie kann ich diesen wiederholenden Alarm abbrechen?

Ich schreibe so etwas wie eine Erinnerung für Benutzer. Benutzer werden Erinnerungen für ihre Ereignisse festlegen, wenn die Zeit gekommen ist, wird ein wiederholender Alarm ausgetriggers, um eine Benachrichtigung in der Statusleiste auszulösen. Aber der Alarm scheint ununterbrochen zu sein, nachdem ich die Benachrichtigung ausgewählt oder die Benachrichtigung gelöscht habe. Ich bin mir nicht sicher, wo ich diesen wiederholenden Alarm abbrechen soll. Im Folgenden sind einige der Codes aufgeführt: Stellen Sie den Wiederholungsalarm in meiner Hauptaktivität ein

alarmTime = Calendar.getInstance(); Intent intent = new Intent(this, AlarmReceive.class); PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmTime.add(Calendar.MINUTE,offset_time); //Schedule the alarm alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), 30 * 1000, sender); 

In meiner OnReceive-Methode zeige ich nur die Benachrichtigung in der Statusleiste an und setze das Flag als FLAG_AUTO_CANCEL

 manager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); // Set the icon, scrolling text and timestamp Notification notification = new Notification(R.drawable.medical, text, System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0); notification.flags = Notification.FLAG_AUTO_CANCEL; manager.notify(R.string.service_text, notification); 

Wie kann ich den Alarm stoppen, wenn der Benutzer die Benachrichtigung auswählt oder löscht?

Rufen Sie cancel() auf AlarmManager mit einem äquivalenten PendingIntent auf, den Sie mit setRepeating() :

 Intent intent = new Intent(this, AlarmReceive.class); PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.cancel(sender); 

Ich habe verschiedene Methoden ausprobiert und konnte es nicht zur Arbeit bringen, also entschied ich mich, einen schmutzigen Trick zu machen. Wenn ich meinen Wiederholungsalarm abbrechen möchte, verwende ich die gleiche Methode, die meinen Alarm erzeugt (und somit den alten ersetzt habe) und annulliere ihn dann sofort. Bei dieser Methode wird, wenn die boolesche Variable auf “true” gesetzt ist, ein Alarm erstellt, der die gleiche ID ersetzt und dann die ersetzte löscht:

 static void CancelRepeatingAlarm(Context context, boolean creating){ //if it already exists, then replace it with this one Intent alertIntent = new Intent(context, AlertReceiver.class); PendingIntent timerAlarmIntent = PendingIntent .getBroadcast(context, 100, alertIntent,PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); if (creating){ alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), INTERVAL, timerAlarmIntent); }else{ alarmManager.cancel(timerAlarmIntent); } 

MainActivity in Ihrer MainActivity die Weckzeit ein. Wenn Sie mehrere Alarme verwenden SharedPreferences , verwenden Sie SharedPreferences , um ihre jeweiligen IDs zu speichern. Hier ist der Code:

 PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, _id,intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager = (AlarmManager) getSystemService(Activity.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); public static Context getContext() { return mContext; } mContext=mainactivity.this; 

In Ihrer zweiten Activity verwenden Sie dieselbe ID aus SharedPreferences . In meinem Code bekomme ich die ID von der ArrayList, Alarm_id . Zuletzt können Sie den MainActivity-Kontext hier mit MainActivity.getContext() . Hier ist der Code:

 AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intentAlarm = new Intent(AlarmListviewActivity.this, MainActivity.class); PendingIntent morningIntent = PendingIntent.getBroadcast(MainActivity.getContext(), Alarm_id.get(positon), intentAlarm, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.cancel(morningIntent); morningIntent.cancel();