2010-07-25 36 views
33

Piszę coś przypominającego dla użytkowników. Użytkownicy ustawią przypomnienia o swoich zdarzeniach, a kiedy nadejdzie czas, zostanie ustawiony alarm powtarzający się, powodujący powiadomienie o pasku stanu. Ale alarm wydaje się być nieprzerwany po tym, jak wybrałem powiadomienie lub wyczyściłem powiadomienie. Nie wiem, gdzie anulować ten powtarzający się alarm. Poniżej znajdują się niektóre z kodów: Ustaw powtarzający się alarm w moim głównym działalnościJak anulować ten powtarzający się alarm?

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); 

W moim OnReceive metody, po prostu wyświetla powiadomienia w pasku stanu i ustawić flagę jako 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); 

Jak mogę przerwać alarm, gdy użytkownik wybierze powiadomienie lub je wyczyści?

Odpowiedz

76

połączeń cancel() na AlarmManager równoważną PendingIntent do którego użyłeś przy 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); 
+3

Chcę anulować alarm po użytkownik widzi zgłoszenie, ale zgłoszenie jest zdefiniowany w onReceive. Jak więc ustalić, czy użytkownik wie o powiadomieniu w mojej głównej działalności przed anulowaniem alarmu? Dzięki – Wen

+2

@Wen: użyj innej funkcji (np. Innej czynności), aby rozpocząć główną aktywność od powiadomienia, niż używasz programu uruchamiającego . Lub, jeśli przenosisz istniejącą instancję głównego działania na pierwszy plan, powiadomienie wywoła funkcjęNewIntent() w działaniu, aby można było anulować alarm. – CommonsWare

+0

Powiadomienie wywoła inną aktywność. Co masz na myśli przez użycie intencji diff, aby rozpocząć działanie od powiadomienia, a nie używać programu uruchamiającego? – Wen

3

w twojej MainActivity ustaw godzinę alarmu. Jeśli zamierzasz używać wielu alarmów, użyj SharedPreferences do przechowywania ich odpowiednich identyfikatorów. Oto kod:

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; 

W swoim drugim Activity użytku samym identyfikatorem z SharedPreferences. W moim kodzie otrzymuję identyfikator z tablicy ArrayList, Alarm_id. Ostatni, możesz użyć kontekstu MainActivity tutaj z MainActivity.getContext(). Oto kod:

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(); 
4

Próbowałem różnych metod i nie mogłem go uruchomić, więc postanowiłem zrobić brudną sztuczkę. Gdy chcę anulować powtarzanie alarmu, używam tej samej metody, która spowodowała wygenerowanie alarmu (i tym samym zastąpienie starego), a następnie natychmiast go anuluję. Dzięki tej metodzie, jeśli zmienna boolean ma wartość true tworzy alarm ow zastępuje i anuluje zastępczą, która ma taką samą ID:

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); 
    } 
Powiązane problemy