Chcę wdrożyć funkcję harmonogramu w moim projekcie. Poszukałem programu Menedżera alarmów, ale nie mogę znaleźć żadnych przykładów.
Czy ktoś może mi pomóc z podstawowym programem do zarządzania alarmami?
java
android
kotlin
alarmmanager
Rajamohan Sugumaran
źródło
źródło
Odpowiedzi:
To jest działający kod. Budzi procesor co 10 minut, aż telefon się wyłączy.
Dodaj do pliku Manifest.xml:
Kod w twojej klasie:
Ustaw alarm z usługi:
Jeśli chcesz ustawić powtarzanie alarmu podczas uruchamiania telefonu:
Dodaj uprawnienie i usługę do pliku Manifest.xml:
I stwórz nową klasę:
źródło
am.setInexactRepeating(...)
aby telefon nie był niepotrzebnie budzony z powodu usługi. Inni programiści powinni wziąć to pod uwagę. 2. Zamiast tworzyć nowyAlarm
wAutoStart
Po otrzymaniuRECEIVE_BOOT_COMPLETED
intencji, może to więcej sensu, aby rozpocząćYourService
zAutoStart
, jak pokazano poniżej: stackoverflow.com/a/5439320/198348WakefulBroadcastReceiver
przeniesiony zAndroid O
Wypróbowałem rozwiązanie z XXX i chociaż początkowo działało, w pewnym momencie przestało działać.
onReceive
Nigdy nie nazywa się ponownie. Spędziłem godziny próbując dowiedzieć się, co to może być. Uświadomiłem sobie, że zIntent
jakiegoś tajemniczego powodu nie był już nazywany. Aby obejść ten problem, odkryłem, że naprawdę musisz określić akcję dla odbiorcy w manifeście. Przykład:Pamiętaj, że nazwa pochodzi
".Alarm"
od kropki. WsetAlarm
metodzie XXX utwórzIntent
następujące elementy:START_ALARM
Wiadomość może być co chcesz go mieć. Właśnie nadałem mu tę nazwę w celach demonstracyjnych.Nie widziałem odbiorców zdefiniowanych w manifeście bez filtru zamiaru, który określa akcję. Tworzenie ich w sposób określony przez XXX wydaje się trochę fałszywe. Podając nazwę akcji, Android będzie zmuszony utworzyć instancję
BroadcastReceiver
użycia klasy odpowiadającej akcji. Jeśli polegasz na kontekście, pamiętaj, że Android ma kilka różnych obiektów, które są WSZYSTKIE zwane kontekstem i mogą nie spowodowaćBroadcastReceiver
utworzenia utworzonego. Zmuszenie Androida do utworzenia wystąpienia klasy za pomocą tylko komunikatu akcji jest znacznie lepsze niż poleganie na niepewnym kontekście, który może nigdy nie zadziałać.źródło
PendingIntent.getBroadcast
dokumentacjiFor security reasons, the Intent you supply here should almost always be an explicit intent, that is specify an explicit component to be delivered to through Intent.setClass
.android:exported="true"
potrzebne?Oto dość samodzielny przykład. Przycisk zmienia kolor na czerwony po 5 sekundach.
Pamiętaj jednak, że AlarmManager uruchamia się nawet wtedy, gdy aplikacja nie jest uruchomiona. Jeśli wywołasz tę funkcję i naciśniesz przycisk Początek, odczekaj 5 sekund, a następnie wróć do aplikacji, przycisk zmieni kolor na czerwony.
Nie wiem, jakie zachowanie byś uzyskał, gdyby Twoja aplikacja w ogóle nie była w pamięci, więc bądź ostrożny z tym, jaki stan chcesz zachować.
źródło
RTC_WAKEUP
zamiast zamiastELAPSED_REALTIME_WAKEUP
) nie wydaje się wyzwalać odbiornika w aplikacji, która najwyraźniej została zwolniona przez system w celu oszczędzania energii, chociaż działa krótko po przeniesieniu ekranu głównego na pierwszy plan.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
źródło
•
AlarmManager
w połączeniu zIntentService
Myślę, że najlepszym wzorcem do użycia
AlarmManager
jest współpraca zIntentService
. JestIntentService
on wyzwalany przezAlarmManager
i obsługuje wymagane działania poprzez intencję odbiorcy. Ta struktura nie ma wpływu na wydajność, jak przy użyciuBroadcastReceiver
. Opracowałem przykładowy kod dla tego pomysłu wkotlin który jest dostępny tutaj:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Stosowanie:
Jeśli chcesz anulować zaplanowany alarm, spróbuj tego:
źródło
Ten kod pomoże ci zrobić powtarzający się alarm. Czas powtarzania może ustawić użytkownik.
Activity_main.xml
MainActivity.java
Jeśli potrzebujesz alarmu tylko raz, wymień go
z
źródło
Zrobiłem własną implementację, aby zrobić to w najprostszy możliwy sposób.
Jedyny następny krok, zaimplementuj go.
Lubię pracować z tą implementacją, ale innym możliwym dobrym sposobem jest jej nie zrobienie
AbstractSystemServiceTask
klasa abstrakcyjna, i budować ją za pomocą Konstruktora.Mam nadzieję, że ci to pomoże.
ZAKTUALIZOWANO Ulepszono, aby umożliwić kilka
BackgroundTaskListener
na tym samymBroadCastReceiver
.źródło
Menedżer alarmów:
Dodaj do układu XML (* zainicjuj te widoki przy tworzeniu w głównym działaniu)
Dodaj do manifestu (tag wewnątrz aplikacji i aktywność poza)
Utwórz klasę AlarmBroadcastManager (odziedzicz ją z BroadcastReceiver)
W głównej aktywności (dodaj te funkcje):
źródło
Oto przykład z Menedżerem alarmów korzystającym z Kotlin:
źródło