Ogni volta che un’app viene eseguita in background, consuma alcune delle risorse limitate del dispositivo, come la RAM. Questo può risultare in un’esperienza utente compromessa, specialmente se l’utente sta usando un’app ad alto consumo di risorse, come giocare o guardare un video. Per migliorare l’esperienza dell’utente, Android 8.0 (livello API 26) impone limitazioni su ciò che le app possono fare mentre sono in esecuzione in background. Questo documento descrive le modifiche al sistema operativo, e come puoi aggiornare la tua app per lavorare bene sotto le nuove limitazioni.

Che cos’è il servizio in Android?

Rinfreschiamo prima cos’è il servizio in Android? Come da documentazione di Android:

Un Serviceè un componente dell’applicazione che può eseguire operazioni di lunga durata in background, e non fornisce un’interfaccia utente.

Quindi, fondamentalmente il servizio è la stessa cosa dell’attività ma non ha il componente UI al suo interno. Quindi, non deve eseguire animazioni fluide a 60 fps. Ecco perché può eseguire qualsiasi compito per un periodo di tempo più lungo dell’attività.

Ci sono tre tipi di servizio:

  • Servizio avviato – Un servizio viene avviato quando un componente dell’applicazione (come un’attività) chiama startService().
  • Servizio legato – Un servizio è legato quando un componente dell’applicazione si lega ad esso chiamando bindService().
  • Servizio schedulato – Un servizio è schedulato quando un’API come la JobScheduler.

Applicazioni in background vs foreground:

Per imparare i cambiamenti di esecuzione in background, dobbiamo prima conoscere la differenza tra applicazione in background e foreground.

Regola empirica, la vostra applicazione sarà considerata un servizio in primo piano se uno qualsiasi dei tre casi seguenti è vero:

  1. La vostra applicazione ha attualmente un’attività visibile.
  2. La vostra applicazione ha un servizio in primo piano in esecuzione.
  3. La vostra applicazione è collegata a un’altra applicazione in primo piano vincolando il servizio o consumando i loro fornitori di contenuti.

Se uno qualsiasi degli scenari di cui sopra non è vero nell’istanza corrente, la tua applicazione è considerata in background.

Perché abbiamo bisogno di limitare l’uso dei servizi in background?

Ogni volta che le tue applicazioni vengono eseguite in background utilizzando servizi, la tua applicazione consuma due risorse preziose: 1) Memoria e 2) Batteria.

Queste due sono risorse limitate sui dispositivi mobili e la maggior parte dei dispositivi di fascia medio-bassa non ha molta memoria o batteria al suo interno.

Supponiamo, se la vostra applicazione sta facendo alcuni compiti molto intensivi in background e utilizzando la maggior quantità di RAM per eseguire quel compito, allora questo creerà l’esperienza utente molto junky, soprattutto se l’utente sta utilizzando un’altra applicazione ad alta intensità di risorse, come giocare un gioco o guardare un video in primo piano.

Come da documentazione per il servizio avviato la pratica migliore è,

Quando l’operazione è completa, il servizio dovrebbe fermarsi da solo.

Ma, molte applicazioni hanno servizi in background di lunga durata, che fondamentalmente funzionano per un tempo infinito per mantenere la connessione socket con il server o monitorare alcuni compiti o attività dell’utente. Questi servizi creano il drenaggio della batteria e inoltre consumano costantemente memoria.

Dagli ultimi due rilasci di Android (a partire da Marshmallow), Google sta cercando molto duramente di aumentare la durata della batteria e ridurre il consumo di memoria utilizzato dalle applicazioni introducendo la modalità doze e app standby ritardando l’esecuzione in background di una certa quantità di tempo se il telefono è inattivo.

Ma la maggior parte delle volte, nonostante la conoscenza dei lati negativi dei servizi a lunga esecuzione, gli sviluppatori li usano ancora. (Soprattutto perché è facile da implementare e mantenere piuttosto che usare altri workaround.)

.