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?
- Ja,
Job.Builder
hat Methode setExtras
mit beliebigem Bundle, auf die später zugegriffen werden kann jobParameters.getExtras()
. Sie können das Bundle nicht ändern ( jobParameters
enthä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.
- 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)?
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 GooglePlayDriver
anzuzeigen, 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?
- GCM Network Manager
GooglePlayDriver
plant 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.
- 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?
- 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?
- 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?
- 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?
- Wenn
onStartJob
false zurückgegeben wird, bedeutet dies, dass Sie Ihre Arbeit abgeschlossen haben. Keine Notwendigkeit aufzurufen jobFinished
. Das RESULT_SUCCESS
wird automatisch gesendet.
Wenn onStartJob
true 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?
onStartJob
sollte die Arbeit so schnell wie möglich auf einen anderen Ausführungsthread verlagern. Sie sind SimpleJobService
ein 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 Driver
basierend auf implementieren AlarmManager
.