Ottimizza l'uso della batteria per le API di pianificazione delle attività

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.