Ich entwerfe eine App, die eine wiederkehrende Aufgabe hat, Präsenz an einen dedizierten Server zu senden, solange die App im Vordergrund steht.
Bei meinen Recherchen im Internet habe ich einige unterschiedliche Ansätze gesehen und wollte wissen, wie dies am besten funktioniert.
Wie kann ein Serveranruf am besten geplant werden?
Die Optionen, die ich sah, waren:
Timer .
Service .
BroadcastReciever mit AlarmManager .
Was ist deine Meinung?
BEARBEITEN:
Der Grund, warum ich dies benötige, ist eine Chat-basierte App, die alle Benutzeraktionen an einen Remote-Server sendet.
dh der Benutzer gibt eine Nachricht ein, der Benutzer liest eine Nachricht, der Benutzer ist online, der Benutzer ist offline usw.
Dies bedeutet, dass ich einmal in jedem Intervall dem Server senden muss, was ich tue, da ich einen Chatraum mit anderen Personen öffne, müssen diese wissen, was ich tue.
Ähnlich wie beim WhatsApp-Nachrichten-Feedback-Mechanismus:
BEARBEITEN 2:
Wiederkehrende Aufgaben sollten jetzt fast immer über die JobScheduler
API (oder FirebaseJobDispatcher
für niedrigere APIs) geplant werden, um Probleme mit dem Entladen des Akkus zu vermeiden, wie im Abschnitt "Wichtige Informationen" des Android-Trainings zu lesen ist
EDIT # 3:
FirebaseJobDispatcher wurde veraltet und durch Workmanager ersetzt , der auch Funktionen von JobScheduler enthält.
quelle
Antworten:
Ich bin mir nicht sicher, aber nach meinem Wissen teile ich meine Ansichten. Ich akzeptiere immer die beste Antwort, wenn ich falsch liege.
Alarm Manager
Der Alarm Manager hält eine CPU-Wecksperre, solange die
onReceive()
Methode des Alarmempfängers ausgeführt wird. Dies garantiert, dass das Telefon erst dann in den Ruhezustand wechselt, wenn Sie die Übertragung abgeschlossen haben. Nach deronReceive()
Rückkehr gibt der Alarm Manager diese Wecksperre frei. Dies bedeutet, dass das Telefon in einigen Fällen in den Ruhezustand wechselt, sobald IhreonReceive()
Methode abgeschlossen ist. Wenn Ihr Alarmempfänger anruftContext.startService()
, wird das Telefon möglicherweise in den Ruhezustand versetzt, bevor der angeforderte Dienst gestartet wird. Um dies zu verhindern, IhreBroadcastReceiver
undService
benötigen eine separate Wake Lock Politik umzusetzen , um sicherzustellen , dass das Telefon läuft weiter , bis der Dienst verfügbar wird.Hinweis: Der Alarm Manager ist für Fälle vorgesehen, in denen Ihr Anwendungscode zu einem bestimmten Zeitpunkt ausgeführt werden soll, auch wenn Ihre Anwendung derzeit nicht ausgeführt wird. Für normale Timing-Vorgänge (Ticks, Timeouts usw.) ist die Verwendung von Handler einfacher und effizienter.
Timer
Timer
hat einige Nachteile, die durch gelöst werdenScheduledThreadPoolExecutor
. Es ist also nicht die beste WahlScheduledThreadPoolExecutor .
Sie können
java.util.Timer
oderScheduledThreadPoolExecutor
(bevorzugt) verwenden, um eine Aktion zu planen, die in regelmäßigen Abständen in einem Hintergrundthread ausgeführt wird.Hier ist ein Beispiel mit letzterem:
Also habe ich es vorgezogen
ScheduledExecutorService
Denken Sie aber auch daran, dass Sie, wenn die Aktualisierungen während der Ausführung Ihrer Anwendung erfolgen, a
Timer
, wie in anderen Antworten vorgeschlagen, oder die neuere verwenden könnenScheduledThreadPoolExecutor
. Wenn Ihre Anwendung auch dann aktualisiert wird, wenn sie nicht ausgeführt wird, sollten Sie sich für das entscheidenAlarmManager
.Beachten Sie, dass, wenn Sie beim Ausschalten Ihrer Anwendung eine Aktualisierung planen, diese alle zehn Minuten häufig auftritt und daher möglicherweise etwas zu viel Strom verbraucht.
quelle
Timer
Wie in den Javadocs erwähnt , ist es besser, einen ScheduledThreadPoolExecutor zu verwenden.
ScheduledThreadPoolExecutor
Verwenden Sie diese Klasse, wenn für Ihren Anwendungsfall mehrere Arbeitsthreads erforderlich sind und das Ruheintervall klein ist. Wie klein ? Nun, ich würde ungefähr 15 Minuten sagen. Die
AlarmManager
Startzeitintervalle zu diesem Zeitpunkt und es scheint darauf hinzudeuten, dass diese Klasse für kleinere Schlafintervalle verwendet werden kann. Ich habe keine Daten, um die letzte Aussage zu stützen. Es ist eine Ahnung.Bedienung
Ihr Dienst kann jederzeit von der VM geschlossen werden. Verwenden Sie Dienste nicht für wiederkehrende Aufgaben. Eine wiederkehrende Aufgabe kann einen Dienst starten , was eine ganz andere Sache ist.
BroadcastReciever mit AlarmManager
Für längere Schlafintervalle (> 15 Minuten) ist dies der richtige Weg.
AlarmManager
Konstanten (AlarmManager.INTERVAL_DAY
) deuten bereits darauf hin, dass Aufgaben mehrere Tage nach ihrer ursprünglichen Planung ausgelöst werden können. Es kann auch die CPU aufwecken, um Ihren Code auszuführen.Sie sollten eine dieser Lösungen verwenden, die auf Ihrem Timing und den Anforderungen des Worker-Threads basiert.
quelle
Mir ist klar, dass dies eine alte Frage ist und beantwortet wurde, aber dies könnte jemandem helfen. In deinem
activity
Im
onCreate
quelle
Zitieren der Planung Wiederholter Alarme - Verstehen Sie die Kompromissdokumente :
Auf dieser Grundlage können Sie einen Serveranruf am besten mithilfe von Google Cloud Messaging (GCM) in Verbindung mit dem Synchronisierungsadapter planen .
quelle
Ich habe eine pünktliche Aufgabe erstellt, bei der die Aufgabe, die der Benutzer wiederholen möchte, in der benutzerdefinierten timeTask run () -Methode hinzugefügt wird. es tritt erfolgreich wieder auf.
}}
quelle