sto postando questo perché su un Huawai Prism II Android 4.1.1 (API 16) dispositivo di gioco su cui sto lavorando (http://www.playlunapuma.com) ha avuto il seguente comportamento fastidioso:
Sto visualizzando il mio menu principale che ha qualche animazione in un SurfaceView e riproduce un suono una volta ogni tanto. Il dispositivo diventa inattivo, si oscura e quindi si spegne. Chiama onDestroy
sulla mia attività e quindi mentre lo schermo è spento. crea di nuovo la mia attività, chiamando onCreate
! Quindi il problema è che le mie animazioni e suoni stanno giocando mentre lo schermo è spento. Quello che voglio davvero succedere è che il mio ciclo di animazione non funzioni affatto se lo schermo è spento. I ricevitori broadcast non funzionano perché non riesco a memorizzare lo stato dall'ultima volta in cui lo schermo si è spento. Ho pensato ad alcuni hack che coinvolgono i booleani statici, ma mi è sembrato un kluge che potrebbe non funzionare e avere orribili casi limite. Lo schermo è già spento quando la mia attività viene creata di nuovo, quindi non ricevo un evento attraverso il ricevitore broadcast che il mio schermo è spento.
Ho risolto questo problema utilizzando sia un ricevitore broadcast che il codice sopra elencati.
Nel mio onCreate
, creo il destinatario della trasmissione. Questo controllerà il mio ciclo di animazione quando lo schermo si accende e si spegne.
if (mScreenReceiver == null) {
mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
mScreenReceiver = new ScreenReceiver();
registerReceiver(mScreenReceiver, mScreenIntentFilter);
}
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
controlAnimLoop(false, false, true);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
controlAnimLoop(false, false, false);
}
}
}
Nel mio controlAnimLoop, controllo isScreenOn
, che è questo codice:
private boolean isScreenOn() {
if (android.os.Build.VERSION.SDK_INT >= 20) {
// I'm counting
// STATE_DOZE, STATE_OFF, STATE_DOZE_SUSPENDED
// all as "OFF"
DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
if (display.getState() == Display.STATE_ON ||
display.getState() == Display.STATE_UNKNOWN) {
return true;
}
}
return false;
}
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
return powerManager.isScreenOn();
}
fonte
2015-08-16 17:38:22
Grazie bro, è questo! :) – cesarferreira
return powerManager.isScreenOn(); –
Sì @Sponge, è meglio la tua strada, il condizionale era solo per chiarirlo un po 'di più per gli sviluppatori inesperti solo perché la maggior parte di loro invece di usare 'return true' aggiungerà il proprio codice. –