Android. Wird WorkManager ausgeführt, wenn die App geschlossen ist?

Lesezeit: 7 Minuten

Ich möchte nächtliche Datenbankaktualisierungen planen. Also verwende ich den neuen Android WorkManager. Mein Verständnis ist, dass es, sobald es einmal geplant ist, unabhängig vom Lebenszyklus der App immer im Hintergrund ausgeführt wird. Ist das richtig? Meine ersten Tests zeigen, dass nur gearbeitet wird, wenn die App läuft.

val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
                        .addTag("DATABASE_UPDATE_SERVICE")
                        .build()
WorkManager.getInstance().enqueue(locationWork)

Android Wird WorkManager ausgefuhrt wenn die App geschlossen ist
Mikepenz

Basierend auf verschiedenen Problemen, über die berichtet wurde Arbeitsmanager Bugtrackerihre Dokumentation ist nicht ganz genau über das genaue Verhalten der Arbeitsmanager in solchen Grenzfällen.

Auf bestimmten Geräten werden Apps zwangsweise beendet, wenn die App aus dem Task-Manager gelöscht wird, sodass dieser Teil erwartet wird. … Quelle


Leider implementieren einige Geräte das Beenden der App aus dem Recents-Menü als Zwangsstopp. Stock Android macht das nicht. Wenn eine App zwangsweise gestoppt wird, kann sie keine Jobs ausführen, Alarme oder Broadcasts empfangen usw. Leider ist es für uns nicht machbar, das Problem anzugehen – das Problem liegt im Betriebssystem und es gibt keine Problemumgehung. Quelle


Das einzige Problem, auf das wir gestoßen sind, ist der Fall, in dem einige chinesische OEMs das Ausblenden von Swipe aus Recents als Zwangsstopp behandeln. In diesem Fall plant WorkManager beim nächsten Start der App alle ausstehenden Aufträge neu. Angesichts der Tatsache, dass dies eine CDD-Verletzung ist, kann WorkManager nicht viel mehr tun, wenn es sich um eine Client-Bibliothek handelt. Quelle


Wenn sich ein Gerätehersteller dazu entschieden hat, Standard-Android zu modifizieren, um das Stoppen der App zu erzwingen, funktioniert WorkManager nicht mehr (ebenso wie JobScheduler, Alarme, Rundfunkempfänger usw.). Es gibt keine Möglichkeit, dies zu umgehen. Einige Gerätehersteller tun dies leider, sodass WorkManager in diesen Fällen bis zum nächsten Start der App nicht mehr funktioniert. Quelle


Mit intensiver Prüfung von a OneTimeWorkRequest (ohne Einschränkungen) auf einem Pixel 2 XL mit Standard-Android ist das Verhalten wie folgt:

  • Task-Manager schließen:
    • Die Arbeit geht weiter (nach einer Weile)
  • Gerät neu starten (Arbeit läuft):
    • Die Arbeit wird nach dem Neustart fortgesetzt
  • App-Info „Stopp erzwingen“:
    • Die Arbeit stoppt, wird erst fortgesetzt, wenn die App erneut gestartet wird
  • Gerät neu starten (Arbeit wurde “Force Stopped”):
    • Die Arbeit wird erst fortgesetzt, wenn die App erneut gestartet wird

Eine vollständige Liste der verschiedenen OEM-Verhalten finden Sie unter dontkillmyapp.com. Es scheint, dass das Android-Team dieses Problem ebenfalls anerkennt und einen Test dafür in seinen CTS-Test für Android Q aufgenommen hat. Quelle

  • Was ist der Unterschied zwischen dem Neustart des Geräts (Arbeit läuft) und dem Neustart (Arbeit wurde zwangsweise gestoppt)? In beiden Fällen lief die Arbeit, als das Gerät neu gestartet wurde.

    – Johannes

    17. Juli 19 um 15:15 Uhr

  • Wenn ich das Gerät auf meinem Nexus 6P neu starte, wenn keine Arbeit ausgeführt wird, aber in naher Zukunft ausgeführt werden soll, wird es erst ausgeführt, wenn die App gestartet wird. Ich habe dies mit OneTimeWorkRequest getestet. Wenn die App jedoch ausgeführt wird und der Worker nicht ausgeführt wird, aber in naher Zukunft ausgeführt werden soll, Sie aber über die App wischen, um sie zu schließen, indem Sie sie aus dem Menü „Zuletzt verwendet“ entfernen, wird sie zur geplanten Zeit gestartet.

    – Johannes

    17. Juli 19 um 15:30 Uhr


  • @AndroidDev ja “Standard” Android lässt zu, dass es ausgeführt wird, wenn Sie es im Recents-Menü wegwischen, da es das Beenden der App nicht erzwingt. aber Samsung macht zum Beispiel einen Force Kill. für den Neustart. welche Android-Version läuft dort, auch welche Version von Workmanager. das könnte sich auch auf die Dinge auswirken

    – mikepenz

    17. Juli 19 um 21:59 Uhr

  • @mikepenz, wie wird das Löschen der letzten Aufgaben als a Schlecht Aktion? Jeder Benutzer macht das periodisch, bedeutet das, dass nicht alle geplanten Jobs ausgeführt werden sollten? In welchem ​​Fall werden dann Jobs ausgeführt? Nur für den Fall, dass der Benutzer die App mindestens einmal gestartet und die Liste der letzten Aufgaben nie gelöscht hat?? Macht für mich keinen Sinn.

    – Azizbekisch

    11. Juni 2020 um 12:12 Uhr


  • Ich beende den App-Prozess im Namen des Systems (dh Prozess-Kill-Szenario, wenn Daten im Bundle gespeichert und beim nächsten Start wiederhergestellt werden sollen). Wenn das System einen Ressourcenmangel hat und der App-Prozess vom System beendet wird, wird der Job auch in diesem Fall nicht ausgeführt. Ich bin neugierig, was ist dann der Zweck von WorkManager?

    – Azizbekisch

    11. Juni 2020 um 12:14 Uhr


Android Wird WorkManager ausgefuhrt wenn die App geschlossen ist
Sagar

Mein Verständnis ist, dass es, sobald es einmal geplant ist, unabhängig vom Lebenszyklus der App immer im Hintergrund ausgeführt wird. Ist das richtig?

Ja. Basierend auf Dokumentation

Die Aufgabe wird weiterhin garantiert ausgeführt, auch wenn Ihre App zwangsweise beendet oder das Gerät neu gestartet wird.

WorkManager wählt die geeignete Methode zum Ausführen Ihrer Aufgabe basierend auf Faktoren wie der Geräte-API-Ebene und dem App-Status. Wenn WorkManager eine Ihrer Aufgaben ausführt, während die App ausgeführt wird, kann WorkManager Ihre Aufgabe in einem neuen Thread im Prozess Ihrer App ausführen. Wenn Ihre Anwendung nicht ausgeführt wird, wählt WorkManager eine geeignete Methode zum Planen einer Hintergrundaufgabe – abhängig von der API-Ebene des Geräts.

WorkManager kann je nach API-Ebene JobScheduler, Firebase JobDispatcher oder AlarmManager verwenden. Es respektiert den Doze und berücksichtigt alle anderen Einschränkungen, bevor es die Arbeit ausführt. Sie können im Doze-Modus mit einer gewissen Verzögerung rechnen, da er auf das Wartungsfenster warten könnte.

Notiz:

WorkManager ist für Aufgaben gedacht, die eine Garantie erfordern, dass das System sie auch dann ausführt, wenn die App beendet wird, wie das Hochladen von App-Daten auf einen Server. Es ist nicht für prozessinterne Hintergrundarbeiten vorgesehen, die sicher beendet werden können, wenn der App-Prozess beendet wird. Für solche Situationen empfehlen wir die Verwendung von ThreadPools.

  • Es reicht also aus, die Aufgabe nur einmal in die Warteschlange einzureihen, und sie wird für immer ausgeführt, bis sie explizit abgebrochen wird? Was ich beobachte ist, dass es nur einmal läuft und wenn die App läuft.

    – Dienstag vier Uhr morgens

    4. Juni 18 um 14:06 Uhr

  • @TuesdayFourAM Ja. Es reicht. Es sollte alle 24 Stunden laufen. Das müssen Sie für API > Lollipop verstehen. Es wird JobScheduler verwenden, um den Job zu planen. Es respektiert den Doze-Modus und die Aufgabe wird während des Wartungsfensters ausgeführt

    – Sagar

    4. Juni 18 um 14:36 ​​Uhr


  • Ich habe versucht, eine OneTimeWorkRequest in meinem Worker zu aktivieren. Ich habe ein einfaches Protokoll und einen Thread-Sleep eingefügt. Es hat gut funktioniert, aber sobald ich die App durch Wischen beende, gab es keine Protokolle mehr.

    – Adel Turk

    16. Juli 18 um 15:36 Uhr

  • Was passiert, wenn wir die App mit einer neuen Logik für die Worker-Aufgabe aktualisieren? Werden die bereits in die Warteschlange gestellten Aufgaben mit der neuen Logik aktualisiert?

    – Binod Adhikary

    28. August 18 um 9:22 Uhr

  • Auf meinem Android 9-Gerät funktionierte der Arbeitsmanager nicht, als ich die App schloss. Aber ich brauche wirklich, dass mein Service immer funktioniert.

    – Hilal

    10. Juni 19 um 1:52 Uhr

Android Wird WorkManager ausgefuhrt wenn die App geschlossen ist
Vikasdeep Singh

Das sagt die Dokumentation:

Hinweis: WorkManager ist für Aufgaben gedacht, die eine Garantie erfordern, dass das System sie auch dann ausführt, wenn die App beendet wird, wie das Hochladen von App-Daten auf einen Server. Es ist nicht für prozessinterne Hintergrundarbeiten vorgesehen, die sicher beendet werden können, wenn der App-Prozess beendet wird. Für solche Situationen empfehlen wir die Verwendung von ThreadPools.

Aber es muss eine Bedingung geben. Wenn diese Bedingung erfüllt ist, führt WorkManager die Aufgabe aus (das ist wichtig). Bedingungen wie “nur während das Gerät lädt und online ist”

Lesen Sie dies sorgfältig, Der WorkManager versucht, Ihre Aufgabe in dem von Ihnen angeforderten Intervall auszuführen. vorbehaltlich der Einschränkungen, die Sie auferlegen und seine anderen Anforderungen.

Hier habe ich ein gutes Tutorial zur Verwendung von WorkManager zum Planen von Aufgaben gefunden: https://android.jlelse.eu/how-scheduling-work-with-new-android-jetpack-component-workmanager-852163f4825b

  • Wenn ich also wie in meinem Fall eine Aufgabe ohne Bedingungen ausführe, wird sie immer ausgeführt?

    – Dienstag vier Uhr morgens

    4. Juni 18 um 14:04 Uhr

  • @TuesdayFourAM nein, es wird nicht ausgeführt. Sie müssen eine Bedingung festlegen, wenn diese Bedingung erfüllt ist, wird Ihre Aufgabe ausgeführt. Beispielsweise; upload my photos to server when connected with Wifi.

    – Vikasdeep Singh

    4. Juni 18 um 14:07 Uhr

  • @TuesdayFourAM Willkommen!

    – Vikasdeep Singh

    4. Juni 18 um 14:15 Uhr

  • Ich habe hinzugefügt .setRequiredNetworkType(Netzwerktyp.NOT_REQUIRED) zur Arbeitsdefinition und es hat nicht geholfen. Die Arbeit wurde nur einmal gestartet und dann nie wieder ausgeführt. Also, ich verstehe immer noch nicht wirklich, wie es funktioniert.

    – Dienstag vier Uhr morgens

    4. Juni 18 um 14:22 Uhr

  • Ich habe das Tutorial verfolgt, das Sie in Ihrem Kommentar hinzugefügt haben, und diese Frage auch an den Autor des Tutorials gesendet.

    – Dienstag vier Uhr morgens

    4. Juni 18 um 14:24 Uhr

.

804730cookie-checkAndroid. Wird WorkManager ausgeführt, wenn die App geschlossen ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy