In diesem Dokument wird erläutert, wie Sie Apps zur WorkManager-Clientbibliothek migrieren. statt der GCMNetworkManager-Bibliothek Hintergrundvorgänge auszuführen. Die ist die Verwendung von WorkManager bei der Planung von Hintergrundjobs für eine App am besten geeignet. Von einschließlich der GCM-Bibliothek von WorkManager, können Sie aktivieren, dass WorkManager GCM zum Planen der Aufgaben auf Android-Geräten mit API-Level 22 planen oder niedriger.
Zu WorkManager migrieren
Wenn deine App derzeit GCMNetworkManager für Hintergrundvorgänge verwendet, Führen Sie die folgenden Schritte aus, um zu WorkManager zu migrieren.
Für die folgenden Schritte gehen wir davon aus, dass Sie mit den folgenden Schritten beginnen: GCMNetworkManager-Code, der Ihre Aufgabe definiert und plant:
Kotlin
val myTask = OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService::class.java) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build() GcmNetworkManager.getInstance(this).schedule(myTask)
Java
// In GcmNetworkManager, this call defines the task and its // runtime constraints: OneoffTask myTask = new OneoffTask.Builder() // setService() says what class does the work .setService(MyUploadService.class) // Don't run the task unless device is charging .setRequiresCharging(true) // Run the task between 5 & 15 minutes from now .setExecutionWindow( 5 * DateUtil.MINUTE_IN_SECONDS, 15 * DateUtil.MINUTE_IN_SECONDS) // Define a unique tag for the task .setTag("test-upload") // ...finally, build the task and assign its value to myTask .build(); GcmNetworkManager.getInstance(this).schedule(myTask);
In diesem Beispiel wird davon ausgegangen, dass MyUploadService
den tatsächlichen Uploadvorgang definiert:
Kotlin
class MyUploadService : GcmTaskService() { fun onRunTask(params: TaskParams): Int { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS } }
Java
class MyUploadService extends GcmTaskService { @Override public int onRunTask(TaskParams params) { // Do some upload work return GcmNetworkManager.RESULT_SUCCESS; } }
WorkManager-Bibliotheken hinzufügen
Wenn Sie die WorkManager-Klassen verwenden möchten, müssen Sie die WorkManager-Bibliothek zu Ihrem Abhängigkeiten zu erstellen. Sie müssen auch die WorkManager-GCM-Bibliothek hinzufügen, aktiviert WorkManager die Verwendung von GCM für die Auftragsplanung, wenn Ihre App auf Geräte, die JobScheduler nicht unterstützen (d. h. Geräte mit API-Level 22) oder niedriger). Ausführliche Informationen zum Hinzufügen der Bibliotheken finden Sie unter Erste Schritte mit WorkManager.
Manifest ändern
Bei der Implementierung von GCMNetworkManager haben Sie
GcmTaskService
in dein App-Manifest ein, wie in GcmNetworkManager
beschrieben.
Referenzdokumentation.
GcmTaskService
sieht sich die eingehende Aufgabe an und delegiert sie an die Aufgabe
-Handler. WorkManager verwaltet die Aufgabendelegierung für Ihren Worker, sodass Sie nicht mehr
brauchen eine Klasse,
die das erledigt. entfernen Sie einfach GcmTaskService
aus dem
Manifests.
Worker definieren
Deine GCMNetworkManager-Implementierung definiert ein OneoffTask
oder RecurringTask
,
was genau angibt, was zu tun ist. Sie müssen das so umformulieren,
Worker
, wie unter Arbeit definieren
-Anfragen.
Das Beispiel für GCMNetworkManager
Code
definiert eine myTask
-Aufgabe. Das WorkManager-Äquivalent sieht so aus:
Kotlin
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork() : Result { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
Java
public class UploadWorker extends Worker { public UploadWorker( @NonNull Context context, @NonNull WorkerParameters params) { super(context, params); } @Override public Result doWork() { // Do the upload operation ... myUploadOperation() // Indicate whether the task finished successfully with the Result return Result.success() } }
Es gibt einige Unterschiede zwischen der GCM-Aufgabe und der Worker
:
- GCM verwendet ein
TaskParams
-Objekt, um Parameter an die Aufgabe zu übergeben. DieWorkManager
verwendet Eingabedaten, die Sie inWorkRequest
wie folgt angeben können: wie in derWorkManager
-Dokumentation unter Ein-/Ausgabe definieren Ihre Aufgabe. In beiden Fällen können Sie Schlüssel/Wert-Paare übergeben, die beliebige persistente Parameter, die für die Aufgabe benötigt werden. GcmTaskService
signalisiert Erfolg oder Misserfolg, indem Flags wie diese zurückgegeben werden:GcmNetworkManager.RESULT_SUCCESS
. Ein WorkManager-Worker
signalisiert seine Ergebnisse mit einerListenableWorker.Result
wie zum BeispielListenableWorker.Result.success()
, und den Rückgabewert dieser Methode zurückgeben.- Wie bereits erwähnt, legen Sie beim Definieren der
Worker
; stattdessen im nächsten Schritt, wenn Sie dieWorkRequest
.
Arbeitsanfrage planen
Durch Definition eines Worker
kannst du festlegen, was du tun musst. Um festzulegen, wann die Arbeit
abgeschlossen sein sollte, müssen Sie
WorkRequest
:
OneTimeWorkRequest
erstellen oderPeriodicWorkRequest
und Legen Sie die gewünschten Einschränkungen fest, die angeben, wann die Aufgabe ausgeführt werden soll, sowie um Ihre Arbeit zu identifizieren.- Anfrage übergeben an
WorkManager.enqueue()
um die Aufgabe zur Ausführung in die Warteschlange zu stellen.
Im vorherigen Abschnitt wurde beispielsweise gezeigt, wie ein
OneoffTask
in einen entsprechenden Worker
. Diese Worker
enthielt jedoch keine
die Ausführungseinschränkungen und das Tag des OneoffTask
-Objekts. Stattdessen legen wir die
und die Aufgaben-ID beim Erstellen von WorkRequest
. Außerdem geben wir an,
Die Aufgabe darf nur ausgeführt werden, wenn eine Netzwerkverbindung besteht. Sie benötigen keine
explizit eine Netzwerkverbindung mit GCMNetworkManager anfordern,
GCMNetworkManager erfordert standardmäßig eine Netzwerkverbindung, WorkManager jedoch.
erfordern keine Netzwerkverbindung, es sei denn, Sie fügen diese Einschränkung ausdrücklich hinzu.
Nachdem Sie die WorkRequest
definiert haben, fügen wir sie dem WorkManager in die Warteschlange ein.
Kotlin
val uploadConstraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true).build() val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>() .setConstraints(uploadConstraints) .build() WorkManager.getInstance().enqueue(uploadTask)
Java
Constraints uploadConstraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .build(); OneTimeWorkRequest uploadTask = new OneTimeWorkRequest.Builder(UploadWorker.class) .setConstraints(uploadConstraints) .build(); WorkManager.getInstance().enqueue(uploadTask);
API-Zuordnungen
In diesem Abschnitt wird beschrieben, wie einige GCMNetworkManager-Funktionen und -Einschränkungen zugeordnet werden. in WorkManager-Entsprechungen ein.
Einschränkungszuordnungen
Mit GCMNetworkManager können Sie eine Reihe von Einschränkungen dafür festlegen, wann Ihre Aufgabe ausführen. In den meisten Fällen gibt es eine eindeutige WorkManager-Einschränkung. Dieses werden diese Entsprechungen aufgelistet.
Legen Sie Einschränkungen für GCMNetworkManager-Aufgaben fest, indem Sie die entsprechende Methode in
das Builder-Objekt der Aufgabe; Sie können z. B. eine Netzwerkanforderung festlegen,
Task.Builder.setRequiredNetwork()
wird aufgerufen.
In WorkManager erstellen Sie ein
Constraints.Builder
-Objekt und
die Methoden dieses Objekts aufrufen, um Einschränkungen festzulegen (z. B.
Constraints.Builder.setRequiredNetworkType())
,
Erstellen Sie dann mit dem Builder ein Einschränkungsobjekt, das Sie an die
Arbeitsanfrage. Weitere Informationen finden Sie unter Arbeit definieren
-Anfragen.
GCMNetworkManager-Einschränkung | WorkManager-Entsprechung | Hinweise |
---|---|---|
setPersisted() |
(nicht erforderlich) | Alle WorkManager-Jobs bleiben bei Geräteneustarts erhalten. |
setRequiredNetwork() |
setRequiredNetworkType() |
Standardmäßig erfordert GCMNetworkManager Netzwerkzugriff. WorkManager erfordert standardmäßig keinen Netzwerkzugriff. Wenn für den Job ein Netzwerkzugriff erforderlich ist, müssen Sie setRequiredNetworkType(CONNECTED) verwenden oder einen bestimmten Netzwerktyp festlegen. |
setRequiresCharging() |
Andere Zuordnungen
Neben Einschränkungen gibt es noch weitere Einstellungen, die Sie auf GCMNetworkManager anwenden können. Aufgaben. In diesem Abschnitt wird beschrieben, wie Sie diese Einstellungen auf eine WorkManager-Job.
Tags
Alle GCMNetworkManager-Aufgaben müssen über einen Tag-String verfügen, den Sie durch Aufrufen der
setTag()
des Bauarbeiters
. WorkManager-Jobs sind eindeutig durch eine ID gekennzeichnet, die
automatisch von WorkManager generiert; erhalten Sie diese ID, indem Sie
WorkRequest.getId()
In
Arbeitsanfragen können optional ein oder mehrere Tags enthalten. Um ein Tag für
WorkManager-Job ist, rufen Sie die
WorkRequest.Builder.addTag()
bevor Sie diesen Builder zum Erstellen der WorkRequest
verwenden.
In GCMNetworkManager können Sie
setUpdateCurrent()
, um anzugeben, ob die Aufgabe eine vorhandene Aufgabe durch dasselbe Tag ersetzen soll.
Der entsprechende WorkManager-Ansatz besteht darin, die Aufgabe durch Aufrufen
enqueueUniqueWork()
oder enqueueUniquePeriodicWork()
;
Wenn Sie diese Methoden verwenden, geben Sie dem Job einen eindeutigen Namen und geben an, wie
WorkManager sollte die Anfrage bearbeiten, wenn es bereits einen ausstehenden Auftrag mit dieser
Namen. Weitere Informationen finden Sie unter Umgang mit eindeutigen
(geschäftlich).
Aufgabenparameter
Sie können Parameter an einen GCMNetworkManager-Job übergeben, indem Sie folgenden Befehl aufrufen:
Task.Builder.setExtras()
und eine Bundle
übergeben, die die Parameter enthält. WorkManager ermöglicht es Ihnen,
Ein Data
-Objekt für den WorkManager-Job, das die Parameter als Schlüssel/Wert-Paar enthält
Paare. Weitere Informationen finden Sie unter
Eingabedaten zuweisen: