Ich möchte eine Zeitplanfunktion in meinem Projekt implementieren. Also habe ich nach einem Alarmmanager-Programm gegoogelt, aber ich kann keine Beispiele finden.
Kann mir jemand mit einem grundlegenden Alarmmanagerprogramm helfen?
java
android
kotlin
alarmmanager
Rajamohan Sugumaran
quelle
quelle
Antworten:
Dies ist Arbeitscode. Die CPU wird alle 10 Minuten aktiviert, bis sich das Telefon ausschaltet.
Zu Manifest.xml hinzufügen:
Code in Ihrer Klasse:
Alarm vom Service einstellen:
Wenn Sie festlegen möchten, dass der Alarm beim Booten des Telefons wiederholt wird:
Fügen Sie Manifest.xml die Berechtigung und den Dienst hinzu:
Und erstelle eine neue Klasse:
quelle
am.setInexactRepeating(...)
das Telefon zu verwenden, damit es aufgrund des Dienstes nicht unnötig aufgeweckt wird. Andere Programmierer sollten diese Tatsache zur Kenntnis nehmen. 2. Anstatt nach Erhalt der Absicht ein neuesAlarm
In zu erstellen , ist es möglicherweise sinnvoller, von hier aus zu beginnen , wie hier gezeigt: stackoverflow.com/a/5439320/198348AutoStart
RECEIVE_BOOT_COMPLETED
YourService
AutoStart
WakefulBroadcastReceiver
vonAndroid O
Ich habe die Lösung von XXX ausprobiert und während sie anfänglich funktionierte, funktionierte sie irgendwann nicht mehr. Die wurden
onReceive
nie wieder angerufen. Ich habe stundenlang versucht herauszufinden, was es sein könnte. Mir wurde klar, dass dasIntent
aus irgendeinem mysteriösen Grund nicht mehr genannt wurde. Um dies zu umgehen, habe ich festgestellt, dass Sie im Manifest wirklich eine Aktion für den Empfänger angeben müssen. Beispiel:Beachten Sie, dass der Name
".Alarm"
mit dem Punkt übereinstimmt.setAlarm
Erstellen Sie in der XXX- MethodeIntent
Folgendes:Die
START_ALARM
Nachricht kann so sein, wie Sie es möchten. Ich habe ihm diesen Namen nur zu Demonstrationszwecken gegeben.Ich habe keine im Manifest definierten Empfänger ohne einen Absichtsfilter gesehen, der die Aktion angibt. Sie so zu erstellen, wie XXX es angegeben hat, scheint eine Art Schwindel zu sein. Durch Angabe des Aktionsnamens wird Android gezwungen, eine Instanz
BroadcastReceiver
der Klasse zu erstellen , die der Aktion entspricht. Wenn Sie sich auf den Kontext verlassen, beachten Sie, dass Android mehrere verschiedene Objekte hat, die ALLE als Kontext bezeichnet werden und möglicherweise nicht dazu führen, dass SieBroadcastReceiver
erstellt werden. Es ist weitaus besser, Android zu zwingen, eine Instanz Ihrer Klasse nur mit der Aktionsnachricht zu erstellen, als sich auf einen zweifelhaften Kontext zu verlassen, der möglicherweise nie funktioniert.quelle
PendingIntent.getBroadcast
Dokumentation ,For 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"
benötigt, damit es funktioniert?Hier ist ein ziemlich eigenständiges Beispiel. Nach 5 Sekunden wird eine Taste rot.
Beachten Sie jedoch, dass der AlarmManager auch dann ausgelöst wird, wenn Ihre Anwendung nicht ausgeführt wird. Wenn Sie diese Funktion aufrufen und die Home-Taste drücken, 5 Sekunden warten und dann wieder in Ihre App zurückkehren, wird die Taste rot.
Ich weiß nicht, welche Art von Verhalten Sie erhalten würden, wenn sich Ihre App überhaupt nicht im Speicher befindet. Seien Sie also vorsichtig mit dem Status, den Sie beibehalten möchten.
quelle
RTC_WAKEUP
stattELAPSED_REALTIME_WAKEUP
) scheint den Empfänger nicht in einer App auszulösen, die anscheinend vom System zum Energiesparen entladen wurde, obwohl es kurz nach dem Aktivieren des Startbildschirms funktioniert.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
quelle
•
AlarmManager
in Kombination mitIntentService
Ich denke, das beste Muster für die Verwendung
AlarmManager
ist die Zusammenarbeit mit einemIntentService
. DasIntentService
wird durch das ausgelöstAlarmManager
und behandelt die erforderlichen Aktionen über die Empfangsabsicht. Diese Struktur hat keine Auswirkungen auf die Leistung wie die VerwendungBroadcastReceiver
. Ich habe einen Beispielcode für diese Idee in entwickeltKotlin welches hier verfügbar ist:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Verwendungszweck:
Wenn Sie den geplanten Alarm abbrechen möchten, versuchen Sie Folgendes:
quelle
Dieser Code hilft Ihnen, einen sich wiederholenden Alarm auszulösen. Die Wiederholungszeit kann von Ihnen eingestellt werden.
activity_main.xml
MainActivity.java
Wenn Sie nur einmal einen Alarm benötigen, ersetzen Sie ihn
mit
quelle
Ich habe meine eigene Implementierung vorgenommen, um dies auf möglichst einfache Weise zu tun.
Der einzige nächste Schritt, implementieren Sie es.
Ich arbeite gerne mit dieser Implementierung, aber ein weiterer möglicher guter Weg ist, die
AbstractSystemServiceTask
Klasse nicht abstrakt zu machen und sie über einen Builder zu erstellen.Ich hoffe es hilft dir.
AKTUALISIERT Verbessert, um mehrere
BackgroundTaskListener
gleichzeitig zuzulassenBroadCastReceiver
.quelle
Alarm Manager:
Zum XML-Layout hinzufügen (* Initiieren Sie diese Ansicht beim Erstellen in der Hauptaktivität)
Zum Manifest hinzufügen (Innerhalb des Anwendungs-Tags && außerhalb der Aktivität)
Erstellen Sie die AlarmBroadcastManager-Klasse (erben Sie sie von BroadcastReceiver).
In der Hauptaktivität (Fügen Sie diese Funktionen hinzu):
quelle
Hier ist ein Beispiel mit Alarm Manager unter Verwendung von Kotlin:
quelle