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à.
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
- Workmanager - MAD Skills, serie di video
- Working with WorkManager, dall'Android Dev Summit 2018
- WorkManager: oltre le nozioni di base, dall'Android Dev Summit 2019