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.