2012-06-07 11 views
28

Utknąłem. Kiedy moja aplikacja się uruchamia, chcę sprawdzić, czy alarm jest żywy, który wcześniej ustawiłem. Jeśli nie, to chcę to ustawić.Czy istnieje sposób sprawdzenia, czy alarm jest już ustawiony?

Nawiązałem do this solution. Próbuję dopasować intencję jak ta:

Intent intent = new Intent(); 
     intent.setAction("com.vit.upload"); 
     PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 

Ale to nie działa. Co jeszcze by działało?

Odpowiedz

65

Przede wszystkim trochę tutorial jak uzyskać dostęp do wcześniej utworzonych alarmów:

Można rozróżnić alarmy tworząc każdy z unikalnym identyfikatorem takich jak:

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

Jeżeli chcesz uzyskać dostęp do ten alarm, musisz utworzyć ten sam PendingIntent z tym samym unikalnym identyfikatorem. Na przykład, poniższe będą miały dostęp tylko do alarmu utworzonego za pomocą PendingIntent id 1234. Następnie anuluje on poprzedni i resetuje go.

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

Pomysł jest prosty. Śledź identyfikatory, a następnie użyj ich, aby uzyskać dostęp do odpowiednich alarmów. Jeśli utworzysz wiele alarmów o tym samym identyfikatorze, ostatni z nich anuluje poprzednie.

Przechodząc do głównego problemu, zamiast sprawdzać, czy alarm jest aktywny przy każdym uruchomieniu aplikacji, po prostu przestaw go ponownie w swojej metodzie onCreate(). z tym samym PendingIntentem, jak opisałem powyżej. To oszczędza Ci kłopotów z sprawdzeniem, czy alarm został wcześniej ustawiony, czy nie. Ponieważ Twoim celem jest utrzymanie alarmu przy życiu, nie zaszkodzi to zastąpić wcześniej ustawionym za każdym razem, gdy uruchomisz aplikację. Po prostu upewnij się, że używasz tego samego identyfikatora, aby utworzyć swój PendingIntent.

Nie zapomnij sprawdzić, czy godzina alarmu już minęła, aby uniknąć próby ustawienia alarmu na czas przeszły, który natychmiast go wyzwoli.

Rozważmy inny przypadek: po wyłączeniu urządzenia wszystkie alarmy zostaną anulowane. Nie pozostawia ci to żadnej opcji, ale ustawia je ponownie przy ponownym uruchomieniu komputera. Aby to zrobić, będziesz musiał użyć BroadcastReceiver.

This answer pomoże ci, jak to zrobić. Po prostu odtwórz swój alarm w metodzie onReceive() twojego BroadcastReceiver, jak zasugerowano powyżej.

+0

Cześć dzięki za miejsce pracy ... Ale co będzie, gdy nie będę działał ... mój boot zakończony odbiornik nie będzie działał w takim przypadku (sprawa z Androidem w wersji 3.0) ... Więc jak wymyślić to ... Ponieważ pracuję nad taką aplikacją, że nie chcą żadnej aktywności ... jak zarejestrować tego odbiorcę .. – NullPointerException

+0

Musisz tylko użyć tagów . Sprawdź to: http: //developer.android.com/guide/topics/manifest/receiver-element.html. Jeśli używasz usługi do tworzenia alarmu, musisz zmienić nazwę działania powyżej na swoją nazwę klasy usług. – Erol

+0

Dobrze! ta jest najlepszą odpowiedzią, więc ją nagradzam !! – NullPointerException

5
  • Pierwszy alarm nie działa po ponownym uruchomieniu urządzenia z systemem Android.
  • Możesz użyć wspólnych ustawień binarnych, aby sprawdzić, czy alarm został utworzony, czy nie.
  • Android czasu zamiarem wykorzystania unikalny identyfikator

    Int REQUEST_CODE = 2344 // Unikalny identyfikator
    PendingIntent pIntent = PendingIntent.getBroadcast (kontekst REQUEST_CODE zamiar, PendingIntent.FLAG_NO_CREATE);

trzeba użyć transmisję Boot Receiver, gdy system restart następnie utworzyć ponownie alaram z tym samym kodem żądanie REQUEST_CODE=2344;

+0

Hej, to wygląda na dobrą sugestię, ale podstawowy problem pozostaje taki sam ... Jak sprawdzić, czy pogoda jest już ustawiona, czy nie? i i jeśli istnieje procedura, aby to sprawdzić, to gdzie powinienem napisać kod dla niego? Mam na myśli, kiedy zaczyna się moja aplikacja lub inna aktywność? Proszę pomóż mi .. – NullPointerException

3

basiclly z moim doświadczeniem, jeśli używasz tej samej intencji i FLAG_UPDATE_CURRENT, można mieć pewność, że nie będziesz mieć dwóch alarmów ustawionych dla tego samego celu. Możesz również przyjrzeć się dokładnie FLAG_NO_CREATE, która jest używana z funkcjami get i zwraca wartość null, jeśli wartość pendingintent z opisaną intencją już istnieje.

Pamiętaj też, aby używać tego samego identyfikatora żądania dla oczekujących zamiarów, ponieważ są one możliwe do odróżnienia.

+0

Szczygiel Bardzo prawdziwe jest moje doświadczenie, które mówi, że kiedy używasz tego samego celu i używasz setInexactRepeating, FLAG_UPDATE_CURRENT działa ... –

1

Na podstawie informacji here, nie wydaje się, aby można było zadzwonić, aby bezpośrednio sprawdzić, czy alarm istnieje, czy nie, ale oferuje niektóre obejścia.

Powiązane problemy