Spesso le app richiedono più di una cosa alla volta. Le API Android offrono molti modi diversi per farlo. Scegliere l'opzione giusta è molto importante: un'opzione potrebbe essere adatta a una situazione, ma molto sbagliata per un'altra. Scegliere le API sbagliate può influire negativamente sulle prestazioni o sull'efficienza delle risorse della tua app, consumando potenzialmente la batteria e riducendo le prestazioni del dispositivo dell'utente nel suo complesso. In alcuni casi, se si sceglie l'approccio sbagliato, l'app potrebbe non essere elencata nel Play Store.
Questo documento illustra le diverse opzioni a tua disposizione e ti aiuta a scegliere quella giusta per la 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 le 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 svolta da un'app al di fuori del suo flusso di lavoro principale. Per garantire l'allineamento della comprensione, abbiamo inserito questo elemento in tre categorie principali di tipi di attività: lavoro asincrono, le API di pianificazione delle attività e servizi in primo piano.
Scegli l'opzione giusta
Nella maggior parte degli scenari, puoi determinare le API giuste da utilizzare per la tua attività comprendendo la categoria (lavoro asincrono, le API di pianificazione delle attività o servizi in primo piano) in cui rientra l'attività.
Se hai ancora dubbi, puoi utilizzare i diagrammi di flusso forniti da noi che aggiungono ulteriori sfumature alla decisione. Ognuna di queste opzioni è descritta più dettagliatamente più avanti in questo documento.
Gli scenari principali da considerare per le attività in background sono due:
- L'attività avviata dall'utente mentre l'app è visibile
- L'attività viene avviata in risposta a un evento, interno o esterno
Questi due scenari hanno i propri alberi decisionali.
Lavoro asincrono
In molti casi, un'app deve eseguire operazioni simultanee mentre è in esecuzione in primo piano. Ad esempio, un'app potrebbe dover eseguire un calcolo dispendioso in termini di tempo. Se eseguisse il calcolo nel thread dell'interfaccia utente, l'utente non sarebbe in grado di interagire con l'app fino al termine del calcolo; ciò potrebbe causare un errore ANR. In un caso come questo, l'app dovrebbe utilizzare un'opzione di lavoro asincrono.
Tra le opzioni di lavoro asincrone più comuni ci sono le coroutine Kotlin e i thread Java; puoi trovare ulteriori informazioni nella documentazione relativa al lavoro asincrono. È importante notare che, a differenza delle API Attività in background, non è garantito che il lavoro asincrono venga completato se l'app smette di essere in una fase di ciclo di vita valida (ad esempio, se l'app lascia il primo piano).
API di pianificazione delle attività
Le API di pianificazione delle attività sono un'opzione più flessibile quando devi svolgere attività che devono continuare anche se l'utente lascia l'app. Nella maggior parte dei casi, l'opzione migliore per eseguire attività in background è utilizzare WorkManager, anche se in alcuni casi potrebbe essere appropriato utilizzare l'API della piattaforma JobScheduler
.
WorkManager è una libreria potente che ti consente di configurare job semplici o complicati in base alle tue esigenze. Puoi utilizzare WorkManager per pianificare le attività in modo che vengano eseguite in orari specifici o per specificare le condizioni in cui deve essere eseguita l'attività. Puoi anche configurare catene di attività, in modo che ogni attività venga eseguita a turno, passando i risultati a quella successiva. Per comprendere tutte le opzioni disponibili, leggi l'elenco di funzionalità di WorkManager.
Alcuni degli scenari più comuni per le attività in background includono:
- Recupero periodico di dati dal server
- Recupero dei dati del sensore (ad esempio, dati del contapassi)
- Ricevere dati periodici sulla posizione (devi disporre dell'autorizzazione
ACCESS_BACKGROUND_LOCATION
su Android 10 o versioni successive) - Caricamento di contenuti basati su un attivatore di contenuti, ad esempio 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 sovraccaricare il dispositivo e a volte hanno implicazioni in termini di privacy e sicurezza. Per questi motivi, il sistema pone molte limitazioni su come e quando le app possono utilizzare i servizi in primo piano. Ad esempio, un servizio in primo piano deve essere visibile all'utente e nella maggior parte dei casi le app non possono avviare servizi in primo piano quando le app sono in background. Per ulteriori informazioni, consulta la documentazione sui servizi in primo piano.
Esistono due metodi per creare un servizio in primo piano. Puoi dichiarare il tuo
Service
e specificare che il servizio è
un servizio in primo piano chiamando
Service.startForeground()
. In alternativa, puoi utilizzare WorkManager per creare un servizio in primo piano, come descritto nella sezione relativa all'assistenza per i worker a lunga esecuzione.
Tuttavia, è importante sapere che un servizio in primo piano creato da WorkManager
deve rispettare le stesse restrizioni di qualsiasi altro servizio in primo piano.
WorkManager fornisce solo alcune API pratiche per semplificare la creazione di un servizio in primo piano.
API alternative
Il sistema offre API alternative progettate per offrire prestazioni migliori per casi d'uso più specifici. Se esiste un'API alternativa per il tuo caso d'uso, ti consigliamo di usarla invece di un servizio in primo piano perché dovrebbe migliorare le prestazioni dell'app. La documentazione relativa ai tipi di servizi in primo piano indica quando è 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:
- Utilizzano i trasferimenti di dati avviati dall'utente per eseguire download o caricamenti di grandi dimensioni, anziché creare un servizio di sincronizzazione dei dati in primo piano
- Utilizzare Gestione dispositivi associati per l'accoppiamento Bluetooth e il trasferimento di dati, anziché utilizzare un servizio in primo piano per un dispositivo connesso
- Usando 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
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 non è necessario che l'attività continui a essere eseguita mentre l'app è in background, devi utilizzare il lavoro asincrono. Esistono varie opzioni per svolgere il lavoro asincrono. È importante capire che queste opzioni smettono tutte di funzionare se l'app passa in background. (vengono interrotti anche se l'app viene arrestata). Ad esempio, un'app di social media potrebbe voler aggiornare il proprio feed di contenuti, ma non dovrebbe terminare l'operazione se l'utente lasciava la schermata.
Ci sarà un'esperienza utente 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 i propri asset, l'utente potrebbe non notare se l'operazione viene eseguita subito o nel cuore della notte durante la ricarica del dispositivo. In questi casi, devi utilizzare le opzioni di lavoro in background.
È 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 molte 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 utilizzare un servizio in primo piano. Una volta avviati, questi servizi vengono eseguiti in modo continuo, perciò sono una buona scelta quando interrompere l'attività potrebbe avere un'esperienza utente negativa. Ad esempio, un'app di monitoraggio dell'allenamento potrebbe usare i sensori di posizione per consentire agli utenti di registrare il percorso di jogging su una mappa. Non ti consigliamo di farlo con un'opzione di lavoro in background, perché se l'attività viene messa in pausa, il monitoraggio viene interrotto immediatamente. In una situazione come questa, è più logico un servizio in primo piano.
Tuttavia, poiché i servizi in primo piano possono utilizzare molte risorse del dispositivo, il sistema applica molte limitazioni a quando e come possono essere utilizzati. In molti casi, invece di utilizzare un servizio in primo piano, puoi utilizzare un'API alternativa che gestisce il job al posto tuo con meno problemi. Ad esempio, se l'app deve eseguire un'azione quando l'utente arriva in una determinata posizione, la soluzione migliore è utilizzare l'API Kubernetes anziché monitorare la posizione dell'utente con un servizio in primo piano.
Attività in risposta a un evento
A volte un'app deve eseguire operazioni in background in risposta a un attivatore, ad esempio:
- Annunci in casa
- Messaggi FCM (Firebase Cloud Messaging)
- Sveglie impostate dall'app
Potrebbe essere un attivatore esterno (ad esempio un messaggio FCM) o potrebbe essere in risposta a un allarme impostato dall'app stessa. Ad esempio, un gioco potrebbe ricevere un messaggio FCM che richiede di aggiornare alcuni asset.
Se hai la certezza che l'attività venga completata in pochi secondi, utilizza il lavoro asincrono per eseguirla. Il sistema concede all'app alcuni secondi per eseguire queste attività, anche se l'app era in background.
Se l'attività richiederà più di qualche secondo, potrebbe essere opportuno avviare un servizio in primo piano per gestire l'attività. Anche se l'app è attualmente in background, potrebbe essere consentito avviare un servizio in primo piano se l'attività è stata attivata dall'utente e rientra in una delle esenzioni approvate dalle limitazioni relative all'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à richiederà più di qualche secondo, utilizza le API di pianificazione delle attività.