Tieni il dispositivo attivo

Per evitare di esaurire la batteria, un dispositivo Android rimasto inattivo perde rapidamente addormentato. Tuttavia, a volte un'applicazione deve riattivare lo schermo o la CPU e tenerlo attivo per completare qualche lavoro.

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

Alternative all'uso dei wakelock

Prima di aggiungere il supporto dei wakelock alla tua app, valuta se l'utilizzo dell'app di assistenza 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 una 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 l'app complementare in esecuzione ogni volta che viene installato un dispositivo associato nel raggio d'azione, utilizza Gestione dispositivi companion.

Mantieni lo schermo acceso

Per alcune app, ad esempio le app di giochi o film, è necessario mantenere lo schermo attivo. La 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'altra app) ). Ad esempio:

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 (esaminati nella sezione Mantieni il CPU attivata), non richiede un'autorizzazione speciale e la piattaforma Gestisce correttamente l'utente che passa da un'applicazione all'altra, senza che l'app debba di dover rilasciare risorse inutilizzate.

Un altro modo per implementare questa funzionalità è nel file XML di layout dell'applicazione, utilizzando 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>

L'utilizzo di android:keepScreenOn="true" equivale a utilizzare FLAG_KEEP_SCREEN_ON Puoi scegliere l'approccio migliore per la tua app. Il vantaggio di impostare il flag in modo programmatico nell'attività è che ti offre la possibilità in modo programmatico cancellando il flag in un secondo momento, consentendo allo schermo di girare disattivata.

Modalità Ambient per la TV

Sulla TV FLAG_KEEP_SCREEN_ON per evitare che il dispositivo entri Modalità Ambient durante la riproduzione video attiva. Se il criterio FLAG_KEEP_SCREEN_ON non è impostato in base all'attività in primo piano, il dispositivo entrerà automaticamente in modalità Ambient dopo un periodo di inattività.

Mantieni la CPU accesa

Se devi mantenere la CPU in esecuzione per poter completare alcune operazioni prima va in modalità di sospensione, puoi utilizzare Funzionalità del servizio di sistema di PowerManager chiamati wakelock. I wakelock consentono all'applicazione di controllare lo stato dell'alimentazione del dispositivo host.

La creazione e il blocco dei wakelock possono avere un impatto significativo sulle prestazioni del dispositivo host della batteria. Dovresti quindi usare i wakelock solo quando strettamente necessario e per il tempo più breve possibile. Ad esempio, non dovresti mai avere bisogno utilizzare un wakelock in un'attività. Come descritto sopra, se vuoi mantenere il schermo nelle tue attività, usa FLAG_KEEP_SCREEN_ON

Un caso legittimo per l'utilizzo di un wakelock potrebbe essere un servizio in background che deve recuperare un wakelock per mantenere la CPU in esecuzione per lavorare mentre lo schermo è disattivata. Anche in questo caso, però, questa pratica dovrebbe essere ridotta al minimo a causa del suo impatto della batteria.

Per utilizzare un wakelock, il primo passaggio consiste nell'aggiungere il Autorizzazione WAKE_LOCK per il file manifest dell'applicazione:

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

Se la tua app include un broadcast receiver che utilizza un servizio per svolgere alcune attività, 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() La richiesta alla CPU verrà ritirata. È importante rilasciare un wakelock non appena l'app ha finito di utilizzarlo per evitare di esaurire la batteria.