Pianificazione delle attività

Quando vuoi eseguire attività che continueranno a essere eseguite anche se l'app non è più visibile, ti consigliamo di utilizzare la libreria Jetpack WorkManager. WorkManager offre un meccanismo di pianificazione solido che consente alle attività di persistere durante i riavvii delle app e dei dispositivi.

Tipi di lavoro

WorkManager gestisce tre tipi di lavoro:

  • 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 attività.

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

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 saperne di più 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ò anche essere taggato e denominato, consentendoti di pianificare un lavoro unico e sostituibile 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 Lavoro urgente 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 l'esecuzione immediata. Consulta la guida all'elaborazione in background per scoprire quale soluzione soddisfa le tue esigenze.

Relazione con altre API

Questa tabella mostra la relazione tra WorkManager e API simili. Queste informazioni possono aiutarti a scegliere l'API giusta per i requisiti della tua app.

API Consigliato per Relazione con WorkManager
Coroutines Tutto il lavoro asincrono che non deve essere mantenuto se l'app esce dallo stato visibile. Le coroutine sono il mezzo standard per uscire dal thread principale in Kotlin. Tuttavia, si interrompono non appena l'app viene chiusa. Per il lavoro che deve persistere anche dopo la chiusura dell'app, utilizza WorkManager.
AlarmManager Solo sveglie. A differenza dei normali worker di WorkManager, le sveglie esatte di AlarmManager riattivano 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 di calendario, non per attività in background ricorrenti.

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