les dejo esto porque en un Huawai Prism II Android 4.1.1 (API 16) dispositivo de juego que estoy trabajando (http://www.playlunapuma.com) tuvo el siguiente comportamiento molesto:
Estoy mostrando mi menú principal que tiene algo de animación en un SurfaceView y reproduce un sonido de vez en cuando. El dispositivo se queda inactivo, se atenúa y luego se apaga. Llama a onDestroy
en mi actividad, y luego mientras la pantalla está apagada crea mi actividad nuevamente, llamando al onCreate
! Entonces, el problema es que mis animaciones y sonidos se reproducen mientras la pantalla está apagada. Lo que realmente quiero que suceda es que mi ciclo de animación no se ejecute en absoluto si la pantalla está apagada. Los receptores de difusión no funcionan porque no puedo almacenar el estado desde la última vez que se apagó la pantalla. Pensé en algunos hacks que involucraban booleanos estáticos, pero parecía un kluge que no funcionaba y tenía casos extremos horribles. La pantalla ya está apagada cuando se crea mi actividad nuevamente, por lo que no recibiré un evento a través del receptor de transmisión que indique que mi pantalla está apagada.
Lo resolví utilizando un receptor de emisión y el código enumerado anteriormente.
En mi onCreate
, creo el receptor de difusión. Esto controlará mi ciclo de animación cuando la pantalla se encienda y apague.
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);
}
}
}
En mi controlAnimLoop, puedo comprobar isScreenOn
, que es el código:
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();
}
Gracias hermano, eso es todo! :) – cesarferreira
return powerManager.isScreenOn(); –
Sí @Sponge, es mejor para ti, el condicional solo fue para aclararlo un poco más para desarrolladores sin experiencia simplemente porque la mayoría de ellos en lugar de usar 'return true 'agregará su propio código. –