Hintergrund
Google bietet mehrere Lösungen für die Job- / Aufgabenplanung an, z. B. JobScheduler
und 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:
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?
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.
Kann es gegen die Jobs der Bibliothek geschützt werden (aufgrund eindeutiger IDs)?
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?
Benötigt es
RECEIVE_BOOT_COMPLETED
für den Fall, dass der Job auch nach einem Neustart des Geräts noch geplant werden soll? Die Probe scheint es zu haben.Ist es möglich, eine Liste aller geplanten Jobs und ihrer Informationen (einschließlich Parameter) abzurufen und bestimmte / alle abzubrechen und sogar zu ändern?
Wird ein Job entfernt, wenn die App mit klaren Daten betrieben wird?
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?
Die Methode
onStartJob
in derJobService
Klasse gibt einen Booleschen Wert zurück und die Beschreibung dafür lautet " ob noch mehr Arbeit übrig ist ". Was bedeutet das? Was bedeutet derneedsReschedule
Parameter derjobFinished
Methode? Sind sie miteinander verwandt?Gibt es irgendwelche Einschränkungen, über die ich Bescheid wissen sollte? Zum Beispiel minimale und maximale Werte für jede der Funktionen?
quelle
Antworten:
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?
Job.Builder
hat MethodesetExtras
mit beliebigem Bundle, auf die später zugegriffen werden kannjobParameters.getExtras()
. Sie können das Bundle nicht ändern (jobParameters
enthält nur Getter). Sie können Ihren Job mit flagsetReplaceCurrent(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.
setRecurring(true)
:setTrigger(Trigger.executionWindow(10, 20))
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 bitteadb 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?
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.
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?
7. Wird ein Job entfernt, wenn die App mit klaren Daten betrieben wird?
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?
executionWindow(0, 60*60)
. Der Job wird zwischen 7:00 und 8:00 Uhr ausgeführt.Sie können keinen wiederkehrenden Job verwenden, weil
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?
onStartJob
false zurückgegeben wird, bedeutet dies, dass Sie Ihre Arbeit abgeschlossen haben. Keine Notwendigkeit aufzurufenjobFinished
. DasRESULT_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 aufrufenjobFinished
, 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 verschobenRetryStrategy
.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 sindSimpleJobService
ein Beispiel dafür, was von Ihnen erwartet wird.JobScheduler
. Müssen auch die Situation behandeln, wenn Google Play-Dienste nicht verfügbar sind, sollten wir wahrscheinlichDriver
basierend auf implementierenAlarmManager
.quelle