Po uruchomieniu mojej aplikacji chcę, aby sprawdził, czy określony alarm (zarejestrowany przez AlarmManager) jest już ustawiony i działa. Wyniki z Google wydają się wskazywać, że nie ma na to sposobu. Czy to nadal jest poprawne? Muszę to sprawdzić, aby poinformować użytkownika przed podjęciem jakichkolwiek działań w celu utworzenia nowego alarmu.
231
Odpowiedzi:
W odpowiedzi na opublikowany komentarz, oto szczegółowe rozwiązanie. Załóżmy, że zarejestrowałeś powtarzający się alarm z takim zamiarem:
Aby sprawdzić, czy jest aktywny, możesz:
Kluczem tutaj jest to,
FLAG_NO_CREATE
co opisano w javadoc:if the described PendingIntent **does not** already exists, then simply return null
(zamiast tworzenia nowego)źródło
alarmManager.cancel(pendingIntent)
apendingIntent.cancel()
celem tego rozwiązania return false.Dla innych, którzy mogą tego potrzebować, oto odpowiedź.
Posługiwać się
adb shell dumpsys alarm
Możesz wiedzieć, że alarm został ustawiony i kiedy będą alarmowane i interwały. Również ile razy ten alarm był wywoływany.
źródło
adb shell dumpsys alarm | grep <e.g. package name of your app>
Działa również na nowych systemach Windows (używam Win10)Przykład działania z odbiornikiem (najlepsza odpowiedź dotyczyła tylko akcji).
Warto wspomnieć:
Krótko mówiąc, Twój obiekt PendingIntent powinien mieć te same funkcje (działanie i struktura intencji), aby przejąć nad nim kontrolę.
źródło
Zwróć uwagę na ten cytat z dokumentacji dla ustawionej metody Alarm Managera:
Jeśli wiesz, że chcesz ustawić alarm, nie musisz zawracać sobie głowy sprawdzaniem, czy już istnieje. Po prostu utwórz go przy każdym uruchomieniu aplikacji. Wszystkie wcześniejsze alarmy zastąpisz tym samym
Intent
.Potrzebujesz innego podejścia, jeśli próbujesz obliczyć, ile czasu pozostało do wcześniej utworzonego alarmu lub jeśli naprawdę potrzebujesz wiedzieć, czy taki alarm w ogóle istnieje. Aby odpowiedzieć na te pytania, rozważ zapisanie udostępnionych danych wstępnych w momencie tworzenia alarmu. Możesz zapisać znacznik czasu w momencie ustawienia alarmu, oczekiwany czas wyłączenia alarmu oraz okres powtarzania (jeśli ustawisz alarm powtarzalny).
źródło
Mam 2 alarmy. Używam zamiaru z dodatkami zamiast akcji, aby zidentyfikować zdarzenia:
Chodzi o to, że w przypadku dodatków różnicowych cel (i alarm) nie będzie unikalny. Aby móc zidentyfikować, który alarm jest aktywny, czy nie, musiałem zdefiniować diff
requestCode
:a oto jak powstał alarm:
źródło
PendingIntent.getService
Właśnie znalazłem inne rozwiązanie, wydaje mi się, że działa
źródło
Chociaż prawie wszyscy tutaj udzielili prawidłowej odpowiedzi, żadne ciało nie wyjaśniło, na jakiej podstawie działają Alarmy
Możesz dowiedzieć się więcej o tym
AlarmManager
i jak działa tutaj . Ale oto szybka odpowiedźWidzisz
AlarmManager
zasadniczo harmonogramyPendingIntent
w przyszłości. Aby więc anulować zaplanowany alarm, musisz anulowaćPendingIntent
.Zawsze miej na uwadze dwie rzeczy podczas tworzenia
PendingIntent
PendingIntent
Teraz, aby sprawdzić, czy alarm jest już zaplanowany lub anulować alarm, wystarczy uzyskać do niego dostęp
PendingIntent
. Można to zrobić, jeśli używasz tego samego kodu żądania i używasz goFLAG_NO_CREATE
jak pokazano poniżejDzięki
FLAG_NO_CREATE
nie wróci,null
jeśli jeszczePendingIntent
nie istnieje. Jeśli już istnieje, zwraca odwołanie do istniejącegoPendingIntent
źródło
Zrobiłem prosty (głupi lub nie) skrypt bashowy, który wyodrębnia te długie z powłoki adb, konwertuje je na znaczniki czasu i pokazuje na czerwono.
Spróbuj ;)
źródło
FLAG_NO_CREATE nie jest tworzony w oczekiwaniu, więc podaje wartość logiczną false.
Po sprawdzeniu przez AlarmManager wartości Pending Intent, daje wartość true, ponieważ AlarmManager Update The Flag of Pending Intent.
źródło
Mam wrażenie, że nie ma takiej możliwości, byłoby jednak miło.
Możesz osiągnąć podobny wynik, nagrywając gdzieś Alarm_last_set_time, i mając coś w rodzaju On_boot_starter BroadcastReciever: BOOT_COMPLETED.
źródło