2010-07-25 9 views
33

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 ausgelöst, 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. einige der Codes sind unten: die sich wiederholende Alarm in meiner HaupttätigkeitWie kann dieser sich wiederholende Alarm abgebrochen werden?

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 meinem OnReceive Methode einrichten, Ich zeige nur die Benachrichtigung in der Statusleiste und das Kennzeichen 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?

Antwort

76

Anruf cancel() auf AlarmManager mit einem äquivalenten PendingIntent bis das Sie mit setRepeating() verwendet:

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

alarmManager.cancel(sender); 
+3

Ich möchte diesen Alarm löschen, nachdem Benutzer die Benachrichtigung sieht, aber die Benachrichtigung ist in onReceive definiert. Wie kann ich feststellen, ob der Benutzer die Benachrichtigung in meiner Hauptaktivität kennt, bevor ich den Alarm abbringe Danke, – Wen

+2

@Wen: Verwenden Sie eine andere Absicht (zB andere Aktion), um Ihre Hauptaktivität aus der Benachrichtigung zu starten . Wenn Sie eine vorhandene Instanz der Hauptaktivität in den Vordergrund bringen, löst Ihre Benachrichtigung in der Aktivität onNewIntent() aus, sodass Sie den Alarm dort abbrechen können. – CommonsWare

+0

Die Benachrichtigung löst eine andere Aktivität aus. Was meinen Sie, wenn Sie eine Differenz verwenden, um die Aktivität von der Benachrichtigung aus zu starten, anstatt sie für den Launcher zu verwenden? – Wen

3

In Ihrem MainActivity, stellen Sie die Weckzeit ein. Wenn Sie mehrere Alarme verwenden möchten, 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 Verwendung derselben ID von SharedPreferences. In meinem Code erhalte ich die ID aus der ArrayList, Alarm_id. Zuletzt können Sie den MainActivity-Kontext hier mit MainActivity.getContext() verwenden. Hier ist der Code:

4

Ich versuchte verschiedene Methoden und konnte es nicht zur Arbeit, also beschloss ich, einen schmutzigen Trick zu tun. 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. Mit dieser Methode, wenn die Boolesche Variable auf true gesetzt wird, erzeugt sie einen Alarm ow es ersetzt und streicht dann den Ersatz, die die gleiche ID hat:

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); 
    } 
Verwandte Themen