Persistent work   Parte di Android Jetpack.

Il lavoro è persistente quando rimane pianificato durante i riavvii delle app e del sistema. WorkManager è la soluzione consigliata per il lavoro persistente. Poiché la maggior parte dell'elaborazione in background viene eseguita al meglio tramite un lavoro persistente, WorkManager è quindi anche l'API principale consigliata per l'elaborazione in background in generale.

Tipi di lavoro persistente

WorkManager gestisce tre tipi di lavoro persistente:

  • Immediato: attività che devono iniziare immediatamente e terminare a breve. May be expedited.
  • Lunga esecuzione: attività che potrebbero essere eseguite più a lungo, potenzialmente più di 10 minuti.
  • Differibili: attività pianificate che iniziano in un secondo momento e possono essere eseguite periodicamente.

La figura 1 mostra la relazione tra i diversi tipi di lavoro persistente.

Il lavoro persistente può essere immediato, di lunga durata o differibile
Figura 1: tipi di lavoro persistente.

Allo stesso modo, la tabella seguente descrive i vari tipi di lavoro.

Tipo Periodicità Come accedere
Vista fattura Una volta OneTimeWorkRequest e Worker. Per un'attività rapida, chiama setExpedited() sulla tua richiesta di attività una tantum.
A lunga esecuzione Una tantum o periodico Qualsiasi WorkRequest o Worker. Chiama setForeground() nel lavoratore per gestire la notifica.
Differibile Una tantum o periodico PeriodicWorkRequest e Worker.

Per ulteriori informazioni su come configurare WorkManager, consulta la guida Definizione delle WorkRequest.

Funzionalità di WorkManager

Oltre a fornire un'API più semplice e coerente, WorkManager offre una serie di altri vantaggi principali:

Vincoli di lavoro

Definisci in modo dichiarativo le condizioni ottimali per l'esecuzione del lavoro utilizzando i vincoli di lavoro. Ad esempio, esegui solo quando il dispositivo è connesso a una rete non a consumo, quando è inattivo o quando la batteria è sufficiente.

Pianificazione solida

WorkManager ti consente di pianificare l'esecuzione di un'attività una tantum o ripetutamente utilizzando finestre di pianificazione flessibili. Il lavoro può essere taggato e denominato, consentendoti di programmare lavori unici e sostituibili e monitorare o annullare gruppi di lavoro insieme.

Il lavoro pianificato viene archiviato in un database SQLite gestito internamente e WorkManager si occupa di garantire che questo lavoro venga mantenuto e riprogrammato in caso di riavvio del dispositivo.

Inoltre, WorkManager rispetta le funzionalità e le best practice di risparmio energetico come la modalità Doze, quindi non devi preoccuparti.

Attività rapida

Puoi utilizzare WorkManager per pianificare l'esecuzione immediata del lavoro in background. Devi utilizzare Expedited work per le attività importanti per l'utente e che vengono completate in pochi minuti.

Policy di ripetizione flessibile

A volte il lavoro non va a buon fine. WorkManager offre criteri di ripetizione flessibili, tra cui un criterio di backoff esponenziale configurabile.

Work chaining

Per lavori correlati complessi, collega le singole attività di lavoro utilizzando un'interfaccia intuitiva che ti consente di controllare quali parti vengono eseguite in sequenza e quali in parallelo.

Kotlin

val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java

WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

Per ogni attività di lavoro, puoi definire i dati di input e output. Quando concateni il lavoro, WorkManager passa automaticamente i dati di output da un'attività di lavoro alla successiva.

Interoperabilità dei thread integrata

WorkManager si integra perfettamente con Coroutine e RxJava e offre la flessibilità di collegare le tue API asincrone.

Utilizzare WorkManager per un lavoro affidabile

WorkManager è progettato per il lavoro che deve essere eseguito in modo affidabile anche se l'utente esce da una schermata, l'app si chiude o il dispositivo viene riavviato. Per esempio:

  • Invio di log o analisi ai servizi di backend.
  • Sincronizzazione periodica dei dati dell'applicazione con un server.

WorkManager non è progettato per il lavoro in background in-process che può essere terminato in modo sicuro se il processo dell'app viene interrotto. Inoltre, non è una soluzione generale per tutto il lavoro che richiede un'esecuzione immediata. Consulta la guida all'elaborazione in background per scoprire quale soluzione soddisfa le tue esigenze.

Relazione con altre API

Sebbene le coroutine siano la soluzione consigliata per determinati casi d'uso, non dovresti utilizzarle per attività persistenti. È importante notare che le coroutine sono un framework di concorrenza, mentre WorkManager è una libreria per il lavoro persistente. Allo stesso modo, devi utilizzare AlarmManager solo per orologi o calendari.

API Consigliato per Relazione con WorkManager
Coroutines Tutto il lavoro asincrono che non deve essere persistente. Le coroutine sono il mezzo standard per uscire dal thread principale in Kotlin. Tuttavia, vengono eliminati dalla memoria una volta chiusa l'app. Per il lavoro persistente, utilizza WorkManager.
AlarmManager Solo sveglie. A differenza di WorkManager, AlarmManager riattiva un dispositivo dalla modalità Doze. Pertanto, non è efficiente in termini di gestione dell'alimentazione e delle risorse. Utilizzalo solo per sveglie o notifiche precise, ad esempio eventi del calendario, non per attività in background.

Sostituisci le API deprecate

L'API WorkManager è la sostituzione consigliata per le precedenti API di pianificazione in background di Android, tra cui FirebaseJobDispatcher e GcmNetworkManager.

Inizia

Consulta la Guida introduttiva per iniziare a utilizzare WorkManager nella tua app.

Risorse aggiuntive

Le seguenti sezioni forniscono alcune risorse aggiuntive.

Video

Blog

Campioni