Questa pagina suggerisce alcune best practice per la configurazione di attività in background ben eseguite. Queste best practice sono specificamente mirate a ridurre il consumo della batteria, ma possono anche migliorare le prestazioni del dispositivo in altri modi, ad esempio riducendo l'utilizzo della rete.
Scegli vincoli ottimali e combina le attività
Per ridurre al minimo il carico assegnato alle attività sul dispositivo, è importante specificare vincoli ottimali. Per i job JobScheduler, consulta JobInfo.Builder
per
l'elenco dei vincoli. Ad esempio, se vuoi assicurarti che la tua app
non scarichi la batteria, è una buona idea specificare il vincolo RequiresCharging
. Questo vincolo indica al sistema di non eseguire il job a meno che il livello della batteria non stia effettivamente aumentando. Analogamente, l'utilizzo del Wi-Fi solitamente richiede
meno energia rispetto ai dati mobili. Di conseguenza, se la tua attività richiede una connessione di rete, ma può
attendere fino a quando è disponibile una rete senza limiti, ti consigliamo di impostare un
vincolo di NetworkType.UNMETERED
.
Inoltre, se hai diverse attività simili che rientrano negli stessi vincoli, di solito è una buona idea combinarle in un'unica attività, in modo che il dispositivo si attivi una sola volta. Ad esempio, supponiamo che la tua app abbia tre set di dati diversi da sincronizzare con Cloud Storage. Invece di programmare tre attività diverse (una per ogni set di dati), di solito è preferibile pianificare una singola attività di "sincronizzazione dei dati ", definire i vincoli appropriati e lasciare che l'attività esegua tutte le sincronizzazioni dei dati in sospeso quando viene eseguita.
Detto questo, non dovresti provare a combinare attività non correlate in un'unica attività completa. Assicurati invece di applicare i vincoli appropriati a ogni attività. Ad esempio, se le attività hanno una priorità bassa, assicurati di specificare che devono essere eseguite quando il dispositivo è inattivo e in carica. In questo modo, anche se il dispositivo viene svegliato più volte, l'esperienza utente non viene compromessa né sulla durata della batteria.
Contrassegna le attività come rapide solo se sono urgenti
Se un'attività è particolarmente urgente, puoi contrassegnarla come rapida. (Per i job JobScheduler, chiama JobInfo.Builder.setExpedited(true)
.) In questo modo darai la priorità all'attività in diversi modi. Ad esempio, il sistema esegue subito queste attività quando può e le limitazioni relative alla gestione dell'alimentazione hanno meno probabilità di influire sulle attività più rapide.
Per questi motivi, assicurati di contrassegnare un'attività come accelerata solo quando è necessario. Poiché le attività rapide possono sostituire alcune efficienze del sistema, le attività rapide possono consumare più energia di quanto accadrebbe se non fossero contrassegnate in questo modo.
Dovresti contrassegnare un'attività come rapida solo se è sensibile al tempo e se l'esecuzione dell'attività ha richiesto più tempo per compromettere l'esperienza utente. Ad esempio, se la tua app esegue un'attività per gestire un messaggio FCM ad alta priorità, questo è un motivo appropriato per contrassegnare l'attività come accelerata. Tuttavia, non dovresti contrassegnare un'attività come accelerata, solo per sostituire le ottimizzazioni del sistema.
Controllare perché le attività sono state interrotte
Se le attività vengono interrotte prima del completamento, puoi verificare perché sono state interrotte
chiamando il numero WorkInfo.getStopReason()
. Per i job JobScheduler, chiama
JobParameters.getStopReason()
È importante farlo per un paio di
motivi. Prima di tutto, ovviamente, vuoi che le tue attività vengano completate. Scoprire perché
le tue attività sono state interrotte ti aiuta a evitare situazioni simili. Tuttavia, è probabile che il sistema arresti le attività a causa di un comportamento che consuma troppo risorse. Non
vuoi che la tua app sia un cattivo cittadino, perché usa inutilmente la batteria o la rete.
Ad esempio, se le tue attività vengono spesso interrotte con il motivo STOP_REASON_TIMEOUT
, potrebbe verificarsi un caso limite che a volte fa sì che le attività richiedano molto più tempo del previsto.
Ti consigliamo di utilizzare il tuo motore di analisi per monitorare se le attività della tua app sono state interrotte e per quali motivi.