Firebase JobDispatcher - Wie funktioniert es im Vergleich zu früheren APIs (JobScheduler und GcmTaskService)?

70

Hintergrund

Google bietet mehrere Lösungen für die Job- / Aufgabenplanung an, z. B. JobSchedulerund GcmTaskService. Jeder hat seine eigenen Vor- und Nachteile.

Vor kurzem hat Google eine neue Bibliothek namens "Firebase JobDispatcher" vorgestellt.

Das Problem

Leider gibt es zu dieser neuen API sehr wenig zu lesen. Tatsächlich ist es wirklich schwer, etwas darüber zu finden.

Ich habe nur das Ankündigungsvideo und ein Beispiel gefunden . Aber selbst ihre, es gibt nicht viel über diese API zu wissen.

Die Fragen

Wenn ich mir frühere Fragen, Untersuchungen und Vergleiche mit den anderen APIs ( hier zum Beispiel) anschaue, möchte ich fragen, wie die neue API funktioniert und was bei der Verwendung zu beachten ist:

  1. Kann ein Job Parameter haben, die erhalten bleiben und bei Bedarf sogar geändert werden können? Im Beispiel heißt es: " Ein optionales Bundle mit vom Benutzer bereitgestellten Extras. Die Standardeinstellung ist ein leeres Bundle. " Kann es vom Job bei Ausführung geändert werden?

  2. Können Jobs einfach neu geplant werden? Es heißt " Ein Boolescher Wert, der angibt, ob der Job wiederholt werden soll ". Wie kann gewählt werden, wann ein neuer Zeitplan erstellt werden soll? Ich habe das Beispiel ausprobiert und "Wiederkehrend" gewählt, aber es scheint nicht nur einmal wieder zu laufen.

  3. Kann es gegen die Jobs der Bibliothek geschützt werden (aufgrund eindeutiger IDs)?

  4. Benötigt es besondere Sorgfalt beim Aktualisieren der App (wie bei früheren APIs)? Können Jobs nach einem Update der App noch geplant werden? Beim Testen des Beispiels scheinen die Jobs nach einem Update der App vollständig weg zu sein. Kann es vermieden werden?

  5. Benötigt es RECEIVE_BOOT_COMPLETEDfür den Fall, dass der Job auch nach einem Neustart des Geräts noch geplant werden soll? Die Probe scheint es zu haben.

  6. Ist es möglich, eine Liste aller geplanten Jobs und ihrer Informationen (einschließlich Parameter) abzurufen und bestimmte / alle abzubrechen und sogar zu ändern?

  7. Wird ein Job entfernt, wenn die App mit klaren Daten betrieben wird?

  8. Kann man dem Job mitteilen, dass es am besten ist, wenn er in einem bestimmten Zeitraum ausgeführt wird (Beispiel: zwischen 7:00 und 8:00 Uhr morgens)? Es wird " ExecutionWindowTrigger " erwähnt, das ein Zeitfenster angibt, in dem der Job ausgeführt werden soll . Ist es das? Was passiert, wenn dieses Fenster fehlt?

  9. Die Methode onStartJobin der JobServiceKlasse gibt einen Booleschen Wert zurück und die Beschreibung dafür lautet " ob noch mehr Arbeit übrig ist ". Was bedeutet das? Was bedeutet der needsRescheduleParameter der jobFinishedMethode? Sind sie miteinander verwandt?

  10. Gibt es irgendwelche Einschränkungen, über die ich Bescheid wissen sollte? Zum Beispiel minimale und maximale Werte für jede der Funktionen?

Android-Entwickler
quelle
1
Hallo, ich habe diese Bibliothek für ein paar Tage verwendet, für # 2 kommt sie für mich immer wieder vor, aber sie scheint die im Ausführungsfenster angegebenen Zahlen nicht zu berücksichtigen.
Eriuzo
1
@eriuzo Wie kommt es dir wieder vor? alle wie viele Sekunden / Minuten? Wie hast du es geschafft?
Android-Entwickler
1
@op Ich habe die Zahlen nicht das erste Mal aufgezeichnet, lassen Sie mich das aufzeichnen, vielleicht werde ich morgen eine Antwort
posten
Ich hatte das gleiche Problem. Insbesondere diese Funktion wird in der Google-Dokumentation nicht gut erklärt. Aber dieser Link developer.android.com/topic/performance/scheduling.html#af war großartig für mich. Haben Sie dieses Dokument schon einmal angeschaut? Jetzt verstehe ich, warum Google Firebase.JobSchedule
Rafael Pacheco

Antworten:

102

Tatsächlich ist Firebase Android JobDispatcher eine Abstraktionsebene für Job Scheduling Engines unter Android. Derzeit haben sie nur eine Treiberimplementierung für GCM Network Manager. Das bedeutet, dass es sich derzeit genauso verhält wie GCM Network Manager . Hoffentlich werden in Zukunft mehr Treiber implementiert.

1. Kann ein Job Parameter haben, die erhalten bleiben und bei Bedarf sogar geändert werden können? Im Beispiel heißt es: "Ein optionales Bundle mit vom Benutzer bereitgestellten Extras. Der Standardwert ist ein leeres Bundle." . Ist das alles? Kann es vom Job bei Ausführung geändert werden?

  1. Ja, Job.Builderhat Methode setExtrasmit beliebigem Bundle, auf die später zugegriffen werden kann jobParameters.getExtras(). Sie können das Bundle nicht ändern ( jobParametersenthält nur Getter). Sie können Ihren Job mit flag setReplaceCurrent(true)neu planen und ein neues Bundle angeben.

2. Können Jobs einfach neu geplant werden? Es heißt "Ein Boolescher Wert, der angibt, ob der Job wiederholt werden soll". Wie kann gewählt werden, wann ein neuer Zeitplan erstellt werden soll? Ich habe das Beispiel ausprobiert und "Wiederkehrend" gewählt, aber es scheint nicht nur einmal wieder zu laufen.

  1. Um den Job neu zu planen, müssen Sie Folgendes angeben setRecurring(true):setTrigger(Trigger.executionWindow(10, 20))

Dies wird ausgelöst, sobald die Frist für den Start des Fensters erreicht ist, und die Treiber werden aufgefordert, den Job nach Möglichkeit vor dem Ende des Fensters auszuführen.

3. Kann es gegen Jobs der Bibliothek geschützt werden (aufgrund eindeutiger IDs)?

  1. Job-Tags müssen in Ihrer Bewerbung eindeutig sein. Andere Apps auf dem Telefon haben ihre eigenen Endpunkte (Paketname / Dienstname). Um alle geplanten / abgeschlossenen Jobs für GooglePlayDriveranzuzeigen, verwenden Sie bitte

    adb shell dumpsys activity service GcmService

4. Muss beim Aktualisieren der App besondere Sorgfalt angewendet werden (wie bei früheren APIs)? Können Jobs nach einem Update der App noch geplant werden? Beim Testen des Beispiels scheinen die Jobs nach einem Update der App vollständig weg zu sein. Kann es vermieden werden?

  1. GCM Network Manager GooglePlayDriverplant Jobs nicht neu, nachdem Google Play Services oder die App aktualisiert wurden. Hier ist ein offenes Thema dafür. Im Moment liegt dies in Ihrer Verantwortung.

5. Benötigt es RECEIVE_BOOT_COMPLETED, wenn der Job auch nach einem Neustart des Geräts noch geplant werden soll? Die Probe scheint es zu haben.

  1. Ja, Sie benötigen eine solche Erlaubnis. Builder verfügt über einen Parameter zur Steuerung des Verhaltens: setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT) Wenn Sie einen eigenen Treiber erstellen möchten, müssen Sie sich natürlich selbst um das Leben kümmern.

6. Ist es möglich, eine Liste aller geplanten Jobs und ihrer Informationen (einschließlich Parameter) abzurufen und bestimmte / alle abzubrechen und sogar zu ändern?

  1. Nein, genau wie bei GCM Network Manager. Aber Sie könnten alle Jobs irgendwie selbst verfolgen, während Sie sie so planen, dass sie Dienste spielen.

7. Wird ein Job entfernt, wenn die App mit klaren Daten betrieben wird?

  1. Ja, der Job wird entfernt. Wahrscheinlich hat es sich in früheren Versionen von Google Play Services anders verhalten.

8. Kann man dem Job mitteilen, dass es am besten ist, dass er in einem bestimmten Zeitraum ausgeführt wird (Beispiel: zwischen 7:00 und 8:00 Uhr morgens)? Es wird "ExecutionWindowTrigger" erwähnt, das ein Zeitfenster angibt, in dem der Job ausgeführt werden soll. Ist es das? Was passiert, wenn dieses Fenster fehlt?

  1. Nun, Sie könnten einen Alarm einrichten, der um 7:00 Uhr ausgelöst wird, und einen einmaligen Auftrag mit planen executionWindow(0, 60*60). Der Job wird zwischen 7:00 und 8:00 Uhr ausgeführt.
    Sie können keinen wiederkehrenden Job verwenden, weil

    windowStart - Der früheste Zeitpunkt (in Sekunden), zu dem der Job ausgeführt werden kann. Berechnet ab dem Zeitpunkt, an dem der Job geplant wurde (für neue Jobs) oder zuletzt ausgeführt wurde (für wiederkehrende Jobs).

Außerdem gibt ExecutionWindowTrigger die ungefähre Zeit an. Es ist nicht garantiert, dass es am angegebenen Fenster ausgeführt wird. Wenn das Fenster fehlt, wird der Job später ausgeführt.

9. Die Methode "onStartJob" in der Klasse "JobService" gibt einen Booleschen Wert zurück. Die Beschreibung dafür lautet "ob noch mehr Arbeit übrig ist". . Was bedeutet das? Was bedeutet der Parameter "needReschedule" der Methode "jobFinished"? Sind sie miteinander verwandt?

  1. Wenn onStartJobfalse zurückgegeben wird, bedeutet dies, dass Sie Ihre Arbeit abgeschlossen haben. Keine Notwendigkeit aufzurufen jobFinished. Das RESULT_SUCCESSwird automatisch gesendet.

Wenn onStartJobtrue zurückgegeben wird, bedeutet dies, dass Sie einen Thread gestartet und auf Ergebnisse gewartet haben. Sobald Sie fertig sind, müssen Sie aufrufen jobFinished, um die Google Play-Dienste darüber zu informieren, ob der Job verschoben werden soll oder nicht. Wenn ja, wird der Job abhängig von verschoben RetryStrategy.

10. Gibt es irgendwelche Einschränkungen, über die ich Bescheid wissen sollte? Zum Beispiel minimale und maximale Werte für jede der Funktionen?

    • onStartJobsollte die Arbeit so schnell wie möglich auf einen anderen Ausführungsthread verlagern. Sie sind SimpleJobServiceein Beispiel dafür, was von Ihnen erwartet wird.
    • Es gibt keine Treiberimplementierung für Lollipop JobScheduler. Müssen auch die Situation behandeln, wenn Google Play-Dienste nicht verfügbar sind, sollten wir wahrscheinlich Driverbasierend auf implementieren AlarmManager.
Flavio
quelle
Danke dafür. Leider habe ich diese Frage vor langer Zeit verlassen. Ich werde Ihnen eine Gegenstimme für die Bemühungen geben, aber da ich nicht wissen kann, wie gut es ist, werde ich es immer noch nicht als akzeptiert markieren. Vielleicht werde ich eines Tages wieder darauf zurückkommen und es markieren.
Android-Entwickler
1
Es würde sehr helfen, die zitierte Frage vor der Antwort zu sehen. Jetzt muss man auf und ab scrollen.
Azizbekian
"Gibt es irgendwelche Einschränkungen, über die ich Bescheid wissen sollte?" Es ist wichtig zu beachten, dass der Android-Client für die meisten Firebase-Inhalte Closed Source ist und seltsame Abhängigkeiten von GPS enthält. Dadurch kann Google die Verwendung steuern und verhindert, dass Ihre App auf Amazon Android oder den meisten Android-Geräten in China ausgeführt wird.
Tom
brillante Antwort, um viele grundlegende
Dinge zu klären