2013-08-13 11 views
5

Pracuję nad prostą aplikacją zadań w Androidzie i potrzebuję tworzyć powiadomienia za pomocą AlarmManagera. Mój problem polega na tym, że mam pewne alarmy, które powinny zostać usunięte - a więc ich powiadomienia - ale nie są, więc zdecydowałem - po wpisach, takich jak Delete alarm from AlarmManager using cancel() - Android, aby AlarmManager był statyczną zmienną, aby to samo wystąpienie mogło zostać osiągnięte z całości aplikacja. Droga Robię to jest o następujące metody w moim główne klasy:static AlarmManager w Androidzie

public static AlarmManager getAlarmManagerInstance() { 
     if (sAlarmManager == null && sContext != null) 
      sAlarmManager = (AlarmManager) sContext 
        .getSystemService(Context.ALARM_SERVICE); 
     return sAlarmManager; 
    } 

aw zmiennej sContext zostanie instancja w ten sposób:

@Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_main); 
     sContext = this; 
     initActionBar(); 
    } 

jest to dobry pomysł, aby utworzyć singleton z tej zmiennej? Czy istnieje lepsze podejście?

Dziękuję bardzo z góry.

+0

używać tego samego identyfikatora tworzyć oczekiwaniu intencji .. który wykona tę samą pracę –

+0

, ale używam identyfikatorów zadań, które chcę utworzyć/zmodyfikować, aby utworzyć oczekujące intencje, w taki sposób, że 'PendingIntent oczekujeFirstAlarmIntent = PendingIntent.getBroadcast ( \t \t \t \t \t tym mGoal.getId() intValue(), zamiar, \t \t \t \t \t PendingIntent.FLAG_ONE_SHOT). '.. jest to wciąż ten sam? – noloman

+0

Tak, to jest to samo ... Jeśli to nie powoduje anulowania alarmu, spróbuj użyć różnych flag ... –

Odpowiedz

1

Android dokumentacja mówi:

Nie instancję tej klasy bezpośrednio; zamiast tego pobierz ją przez Context.getSystemService (Context.ALARM_SERVICE).

AlarmManager to tylko klasa zapewniająca dostęp do usług alarmowych systemu.

Usługi te są uruchomione w systemie, więc nie przejmuj się nimi po prostu użyj AlarmManager jako interfejsu do interakcji z nimi.

Więc za każdym razem, że trzeba, aby uzyskać dostęp do tej usługi, wystarczy pobrać go jako dokumentacja mówi:

Context.getSystemService (Context.ALARM_SERVICE)

1

Odradzam tworzenie statycznego alarmu.

Powinieneś postępować zgodnie z poradami podanymi w komentarzach, aby używać identyfikatorów przekazanych do PendingIntents, w ten sposób możesz anulować/zaktualizować swoje alarmy z dowolnego miejsca w aplikacji.

powód, dla którego odradzane Alarm statycznej:

może pojawić się następujący scenariusz, zaplanować alarm i zrobić statyczną odniesienie do niej, po czym użytkownik restartuje telefon. Twój alarm zniknął, podobnie jak statyczny odnośnik do niego.

Jeśli potrzebujesz alarmów do pracy w takim scenariuszu, powinieneś zapisać ich identyfikatory i wymagane informacje we współdzielonych preferencjach/bazie danych/pliku i zmienić ich kolejność naBoot lub na inne wydarzenie odpowiednie dla Twojej aplikacji.

+0

, ale już mam 'BroadcastReceiver' z uprawnieniem' ACTION_BOOT_COMPLETED', dzięki czemu może odtworzyć alarmy z bazy danych podczas ponownego uruchamiania telefonu. Po prostu nie rozumiem tego, jak używać identyfikatorów w 'PendingIntent', ponieważ uważałem, że parametr, który przekazujemy do' PendingIntent' ma być identyfikatorem zadań, a nie alarmem. – noloman

+0

Jeśli nie podasz identyfikatora, to kiedy utworzysz PendingIntent z intencją rozpoczynającą tę samą aktywność/usługę (różne dodatkowe wartości nie liczą się) Android nie będzie w stanie zrobić różnicy między nimi, a ponieważ pakujesz je w Alarmy po zaplanowaniu one, końcowy wynik będzie taki, że za każdym razem, gdy stworzysz nowy alarm, stary zostanie automatycznie anulowany bez twojej wiedzy. A ponieważ powiedziałeś, że twoi alarmmaniści są połączeni z powiadomieniami, powinieneś użyć różnych identyfikatorów, może użyć tego samego identyfikatora, co w przypadku powiadomienia, jeśli dałeś im unikalne identyfikatory – JanBo

+0

http://stackoverflow.com/questions/7496603/how-to- create-different-pendingintent-so-filterequals-return-false ... rozważ także ustawienie akcji zgodnie z twoimi intencjami i możesz filtrować je w ten sposób, jeśli nie lubisz ustawiania identyfikatora dla PendingIntent. – JanBo