Panoramica delle attività in background

Spesso le app devono fare più cose contemporaneamente. Le API Android offrono molti modi diversi per farlo. Scegliere l'opzione giusta è molto importante. Un'opzione potrebbe essere giusta per una situazione, ma molto sbagliata per un'altra. La scelta delle API sbagliate può influire negativamente sul rendimento o sull'efficienza delle risorse della tua app, scaricando la batteria e diminuendo le prestazioni del dispositivo dell'utente nel suo complesso. In alcuni casi, la scelta dell'approccio sbagliato potrebbe impedire la pubblicazione della tua app nel Play Store.

Questo documento illustra le diverse opzioni a tua disposizione e ti aiuta a scegliere quella più adatta alla tua situazione.

Terminologia

Alcuni termini importanti relativi alle attività in background potrebbero essere utilizzati in più modi contraddittori. Per questo motivo, è importante definire i nostri termini.

Se un'app è in esecuzione in background, il sistema applica una serie di limitazioni. Ad esempio, nella maggior parte dei casi, un'app in background non può avviare servizi in primo piano.

Ai fini di questo documento, utilizzeremo il termine "attività" per indicare un'operazione eseguita da un'app al di fuori del suo flusso di lavoro principale. Per garantire l'allineamento nella interpretazione, abbiamo suddiviso questo argomento in tre categorie principali di tipi di attività: lavoro asincrono, le API di pianificazione delle attività, e i servizi in primo piano.

Scegliere l'opzione giusta

Nella maggior parte dei casi, puoi capire quali API utilizzare per l'attività individuandone la categoria (lavoro asincrono, le API di pianificazione delle attività o i servizi in primo piano).

Se hai ancora dubbi, puoi utilizzare i diagrammi di flusso che forniamo per aggiungere più sfumature alla decisione. Ogni opzione è descritta in modo più dettagliato più avanti in questo documento.

Esistono due scenari principali da considerare per le attività in background:

Questi due scenari hanno le proprie strutture ad albero decisionali.

Lavoro asincrono

In molti casi, un'app deve semplicemente eseguire operazioni simultanee mentre è in esecuzione in primo piano. Ad esempio, un'app potrebbe dover eseguire un calcolo che richiede molto tempo. Se il calcolo fosse stato eseguito nel thread dell'interfaccia utente, l'utente non avrebbe potuto interagire con l'app fino al termine del calcolo, il che potrebbe comportare un errore ANR. In un caso come questo, l'app dovrebbe utilizzare un'opzione di lavoro asincrono.

Le opzioni di lavoro asincrono comuni includono le coroutine Kotlin e i thread Java. Puoi trovare maggiori informazioni nella documentazione sul lavoro asincrono. È importante notare che, diversamente dalle API di attività in background, non è garantito il completamento del lavoro asincrono se l'app non è più in una fase del ciclo di vita valida (ad esempio se l'app esce dal primo piano).

API di pianificazione delle attività

Le API di pianificazione delle attività sono un'opzione più flessibile quando devi eseguire attività che devono continuare anche se l'utente esce dall'app. Nella maggior parte dei casi, l'opzione migliore per eseguire attività in background è utilizzare WorkManager, anche se in alcuni casi potrebbe essere opportuno utilizzare l'API della piattaforma JobScheduler.

WorkManager è una potente libreria che ti consente di configurare job semplici o complicati in base alle tue esigenze. Puoi utilizzare WorkManager per pianificare l'esecuzione delle attività in momenti specifici o specificare le condizioni in cui devono essere eseguite. Puoi anche impostare una catena di attività, in modo che ogni attività venga eseguita a turno, passando i risultati alla successiva. Per conoscere tutte le opzioni disponibili, consulta l'elenco delle funzionalità di WorkManager.

Ecco alcuni degli scenari più comuni per le attività in background:

  • Recupero dei dati dal server periodicamente
  • Recupero dei dati dei sensori (ad esempio, i dati del contapassi)
  • Ricezione di dati sulla posizione periodici (è necessario che ti sia stata concessa l'autorizzazione ACCESS_BACKGROUND_LOCATION su Android 10 o versioni successive)
  • Caricamento di contenuti in base a un attivatore dei contenuti, ad esempio le foto create dalla fotocamera

Servizi in primo piano

I servizi in primo piano offrono un modo efficace per eseguire immediatamente attività che non devono essere interrotte. Tuttavia, i servizi in primo piano possono potenzialmente comportare un carico elevato sul dispositivo e a volte hanno implicazioni per la privacy e la sicurezza. Per questi motivi, il sistema impone molte limitazioni su come e quando le app possono utilizzare i servizi in primo piano. Ad esempio, un servizio in primo piano deve essere percepibile dall'utente e, nella maggior parte dei casi, le app non possono avviare servizi in primo piano quando sono in background. Per ulteriori informazioni, consulta la documentazione relativa ai servizi in primo piano.

Esistono due metodi per creare un servizio in primo piano. Puoi dichiarare il tuo Service e specificare che si tratta di un servizio in primo piano chiamando Service.startForeground(). In alternativa, puoi utilizzare WorkManager per creare un servizio in primo piano, come descritto nella sezione Supporto per i worker a lungo termine. Tuttavia, è importante sapere che un servizio in primo piano creato da WorkManager deve rispettare tutte le stesse limitazioni di qualsiasi altro servizio in primo piano. WorkManager fornisce solo alcune API di praticità per semplificare la creazione di un servizio in primo piano.

API alternative

Il sistema offre API alternative progettate per avere un rendimento migliore per casi d'uso più specifici. Se esiste un'API alternativa per il tuo caso d'uso, ti consigliamo di utilizzarla anziché un servizio in primo piano, in quanto dovrebbe migliorare il rendimento della tua app. La documentazione dei tipi di servizi in primo piano indica se è disponibile un'API alternativa valida da utilizzare al posto di un determinato tipo di servizio in primo piano.

Ecco alcuni degli scenari più comuni per l'utilizzo di API alternative:

  • Utilizzo di trasferimenti di dati avviati dall'utente per eseguire download o caricamenti di grandi dimensioni, anziché creare un servizio in primo piano di sincronizzazione dei dati
  • Utilizzo del gestore del dispositivo companion per l'accoppiamento Bluetooth e il trasferimento di dati, anziché utilizzare un servizio in primo piano del dispositivo connesso
  • Utilizzare la modalità Picture in picture per riprodurre i video anziché creare un servizio in primo piano per la riproduzione di contenuti multimediali

Attività avviate dall'utente

Diagramma di flusso che mostra come scegliere l'API appropriata. Questo grafico
  riassume il materiale nella sezione "Attività avviate dall'utente".
Figura 1: come scegliere l'API giusta per eseguire un'attività in background avviata dall'utente.

Se un'app deve eseguire attività in background e l'operazione viene avviata dall'utente mentre l'app è visibile, rispondi a queste domande per trovare l'approccio giusto.

L'attività deve continuare a essere eseguita mentre l'app è in background?

Se l'attività non deve continuare a essere eseguita mentre l'app è in background, devi utilizzare il lavoro asincrono. Esistono diverse opzioni per eseguire operazioni asincrone. È importante capire che tutte queste opzioni smettono di funzionare se l'app passa in background. Si arrestano anche se l'app viene chiusa. Ad esempio, un'app di social media potrebbe voler aggiornare il feed dei contenuti, ma non deve completare l'operazione se l'utente ha abbandonato lo schermo.

L'esperienza utente sarà negativa se l'attività viene differita o interrotta?

È importante valutare se l'esperienza utente verrebbe compromessa se un'attività viene posticipata o annullata. Ad esempio, se un'app deve aggiornare le risorse, l'utente potrebbe non notare se l'operazione avviene immediatamente o nel cuore della notte mentre il dispositivo si ricarica. In questi casi, devi utilizzare le opzioni di lavoro in background.

Si tratta di un'attività breve e fondamentale?

Se l'attività non può essere ritardata e verrà completata rapidamente, puoi utilizzare un servizio in primo piano con il tipo shortService. Questi servizi sono più facili da creare rispetto ad altri servizi in primo piano e non richiedono così tante autorizzazioni. Tuttavia, i servizi brevi devono essere completati entro tre minuti.

Esiste un'API alternativa solo per questo scopo?

Se l'attività non è invisibile all'utente, la soluzione corretta potrebbe essere l'utilizzo di un servizio in primo piano. Questi servizi vengono eseguiti continuamente una volta avviati, quindi sono una buona scelta quando l'interruzione dell'attività potrebbe comportare una cattiva esperienza utente. Ad esempio, un'app di monitoraggio dell'allenamento potrebbe utilizzare i sensori di geolocalizzazione per consentire agli utenti di registrare il percorso di jogging su una mappa. Non è consigliabile eseguire questa operazione con un'opzione di lavoro in background, perché se l'attività viene messa in pausa, il monitoraggio si interrompe immediatamente. In una situazione come questa, un servizio in primo piano è la scelta migliore.

Tuttavia, poiché i servizi in primo piano possono potenzialmente utilizzare molte risorse del dispositivo, il sistema impone molte limitazioni su quando e come possono essere utilizzati. In molti casi, anziché utilizzare un servizio in primo piano, puoi utilizzare un'API alternativa che gestisce il lavoro per te con meno difficoltà. Ad esempio, se la tua app deve eseguire un'azione quando l'utente arriva in una determinata posizione, la soluzione migliore è utilizzare l'API geofence anziché monitorare la posizione dell'utente con un servizio in primo piano.

Attività in risposta a un evento

Diagramma di flusso che mostra come scegliere l'API appropriata. Questo grafico
  riassume il materiale della sezione "Attività in risposta a un evento".
Figura 2: come scegliere l'API giusta per eseguire un'attività in background attivata da eventi.

A volte un'app deve eseguire operazioni in background in risposta a un attivatore, ad esempio:

Può trattarsi di un attivatore esterno (ad esempio un messaggio FCM) o di una risposta a un avviso impostato dall'app stessa. Ad esempio, un gioco potrebbe ricevere un messaggio FCM che gli chiede di aggiornare alcuni asset.

Se puoi assicurarti che l'attività verrà completata in pochi secondi, utilizza il lavoro asincrono per eseguirla. Il sistema concederà all'app alcuni secondi per eseguire queste attività, anche se l'app era in background.

Se l'attività richiede più di qualche secondo, potrebbe essere opportuno avviare un servizio in primo piano per gestirla. Infatti, anche se la tua app è attualmente in background, potrebbe essere consentito avviare un servizio in primo piano se la task è stata attivata dall'utente e rientra in una delle esenzioni approvate dalle limitazioni di avvio in background. Ad esempio, se un'app riceve un messaggio FCM con priorità elevata, può avviare un servizio in primo piano anche se è in background.

Se l'attività richiede più di qualche secondo, utilizza le API di pianificazione delle attività.