Tieni il dispositivo attivo

Per evitare di scaricare la batteria, un dispositivo Android lasciato inattivo si addormenta rapidamente. Tuttavia, in alcuni casi un'applicazione deve riattivare lo schermo o la CPU e tenerlo attivo per completare del lavoro.

L'approccio da adottare dipende dalle esigenze della tua app. Tuttavia, come regola generale dovresti adottare l'approccio più leggero possibile per la tua app, in modo da ridurre al minimo l'impatto dell'app sulle risorse di sistema. Le sezioni seguenti descrivono come gestire i casi in cui il comportamento di sospensione predefinito del dispositivo non è compatibile con i requisiti della tua app.

Alternative all'utilizzo dei wakelock

Prima di aggiungere il supporto dei wakelock alla tua app, valuta se i casi d'uso dell'app supportano una delle seguenti soluzioni alternative:

  • Se la tua app esegue download HTTP a lunga esecuzione, valuta la possibilità di utilizzare DownloadManager.

  • Se la tua app sincronizza i dati da un server esterno, valuta la possibilità di creare un adattatore di sincronizzazione.

  • Se la tua app si basa su servizi in background, valuta la possibilità di utilizzare JobScheduler o Firebase Cloud Messaging per attivare questi servizi a intervalli specifici.

  • Se devi mantenere in esecuzione l'app complementare ogni volta che un dispositivo companion si trova nel raggio d'azione, utilizza Gestione dispositivi companion.

Mantieni lo schermo acceso

Alcune app, ad esempio app di giochi o film, devono mantenere lo schermo attivo. Il modo migliore per farlo è utilizzare FLAG_KEEP_SCREEN_ON nelle tue attività (e solo in un'attività, mai in un servizio o in un altro componente dell'app). Ecco alcuni esempi:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

Il vantaggio di questo approccio è che, a differenza dei wakelock (spiegati nella sezione Mantieni attiva la CPU), non richiede un'autorizzazione speciale e la piattaforma gestisce correttamente gli utenti che si spostano da un'applicazione all'altra, senza che la tua app debba preoccuparsi di rilasciare risorse inutilizzate.

Un altro modo per implementare questa funzionalità consiste nel file XML di layout dell'applicazione, utilizzando l'attributo android:keepScreenOn:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

Utilizzare android:keepScreenOn="true" è come utilizzare FLAG_KEEP_SCREEN_ON. Puoi utilizzare l'approccio migliore per la tua app. Il vantaggio di impostare il flag in modo programmatico nella tua attività offre la possibilità di cancellare il flag in modo programmatico in un secondo momento e quindi di disattivare lo schermo.

Modalità Ambient per la TV

Sulla TV, FLAG_KEEP_SCREEN_ON deve essere utilizzato per evitare che il dispositivo entri in modalità Ambient durante la riproduzione attiva del video. Se l'impostazione FLAG_KEEP_SCREEN_ON non è impostata sull'attività in primo piano, il dispositivo entrerà automaticamente in modalità Ambient dopo un periodo di inattività.

Mantieni attiva la CPU

Se devi mantenere la CPU in esecuzione per completare alcune operazioni prima che il dispositivo vada in sospensione, puoi utilizzare una funzionalità del servizio di sistema di PowerManager chiamata wakelock. I wakelock consentono alla tua applicazione di controllare lo stato di alimentazione del dispositivo host.

La creazione e il blocco di wakelock possono avere un notevole impatto sulla durata della batteria del dispositivo host. Di conseguenza, dovresti utilizzare i wakelock solo quando strettamente necessario e tenerli il più breve possibile. Ad esempio, non dovresti mai aver bisogno di utilizzare un wakelock in un'attività. Come spiegato in precedenza, se vuoi mantenere lo schermo attivo nelle tue attività, utilizza FLAG_KEEP_SCREEN_ON.

Un caso legittimo per l'utilizzo di un wakelock potrebbe essere un servizio in background che deve utilizzare un wakelock per mantenere la CPU in esecuzione quando lo schermo è spento. Anche in questo caso, questa pratica dovrebbe essere ridotta al minimo a causa dell'impatto sulla durata della batteria.

Per utilizzare un wakelock, la prima cosa da fare è aggiungere l'autorizzazione WAKE_LOCK al file manifest dell'applicazione:

<uses-permission android:name="android.permission.WAKE_LOCK" />

Se la tua app include un ricevitore di trasmissione che utilizza un servizio per svolgere alcune operazioni, ecco come impostare direttamente un wakelock:

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

Per rilasciare il wakelock, chiama wakelock.release(). In questo modo la tua richiesta di adesione alla CPU viene ritirata. È importante rilasciare un wakelock non appena l'app ha terminato di utilizzarlo per evitare di consumare la batteria.