FLAG_TURN_SCREEN_ON no siempre funciona

Inicie una actividad de un BroadcastReceiver, que es activado por un alaram (tipo RTC_WAKEUP). En onCreate de esa actividad añado estas banderas

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ); 

Problema es que a veces (aproximadamente 10% de casos) la pantalla no se enciende. La alarma se activa correctamente (aquí se oye el sonido de una notificación, que también se enciende en el receptor onReceive), luego, si presiono el botón de encendido del teléfono, la pantalla se enciende, mostrando mi actividad y se apaga inmediatamente. Que, el botón de encendido funciona bien.Esto ocurre en Android 2.3.7 y aquí está el método onReceive ()

 @Override public void onReceive(Context context, Intent intent) { m_Context = context; Bundle extras = intent.getExtras(); final int id = extras.getInt("timer_id"); Intent activityIntent = new Intent(m_Context, MyActivity.class); activityIntent.putExtra("timer_id", id); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); m_Context.startActivity(activityIntent); // and now load the alarm sound and play it for the desired time showFinishedNotification(); } 

Me gustaría evitar usar PowerManager, ya que necesita un permiso, y las banderas son la forma preferida.

Lo que podría ser un problema? Logcat no muestra ningún problema …

Estoy un poco tarde para la fiesta aquí, pero he estado luchando esto por un tiempo y ahora finalmente encontró una manera de obtener la pantalla para desbloquear cada vez. Añado los indicadores en el evento onAttachToWindow (). Normalmente lo hago desde un WakefulBroadcastReceiver para que la pantalla transiciones sin problemas, pero que es caso de uso dependiente.

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); //Screen On getWindow().addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } private void clearFlags() { //Don't forget to clear the flags at some point in time. getWindow().clearFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } 

De mi experiencia e investigación sobre este tema:

  • El FLAG_TURN_SCREEN_ON no se puede utilizar para activar y desactivar la pantalla varias veces en su aplicación.

  • El FLAG_TURN_SCREEN_ON sólo se puede utilizar una vez para activar la pantalla cuando se crea una nueva actividad (preferiblemente en el método onCreate ()) o cuando se vuelve a crear una vista .

Ahora, puede evitar esta limitación mediante:

  • Iniciar una nueva actividad y establecer la bandera allí, luego finalizar la actividad (por el usuario o mediante programación) para que la pantalla se apague.
  • Ajustando los parámetros params.screenBrightness a "dim" como sea posible , a veces la pantalla "aparece OFF". A continuación, puede aumentar el brillo para "encender" la pantalla. Sin embargo, esto a menudo no funciona ya que la pantalla sigue siendo tenue pero visible, también esto no funciona si el usuario bloquea el teléfono.
  • Uso de Power Manager Wakelock (esto todavía funciona, pero Android desprecia esta funcionalidad, por lo que están desalentando el uso de esta técnica). Sin embargo, por lo que puedo decir esto es la única manera que puedo conseguir mi aplicación para encender / apagar la pantalla de forma fiable.

Ninguno de estos son ideales (de hecho, se sienten como hacks), sino simplemente utilizar el que mejor se adapte a sus necesidades de aplicación.

Puede leer más aquí:

  • Código fuente del despertador Android
  • Código fuente del reloj de escritorio de Android
  • Atenuación de la pantalla para que aparezca OFF / ON
  • Uso de un wakelock para mantener la pantalla encendida / apagada
  • Despertar el dispositivo y activar la pantalla en múltiples opciones

Problema es que a veces (aproximadamente 10% de casos) la pantalla no se enciende

Si tuviera que adivinar, el dispositivo se está quedando dormido antes de que la actividad se inicie. Una vez que onReceive() devuelve, el dispositivo puede y volverá a dormirse, y pasará algún tiempo después de que onReceive() regrese antes de que su actividad se inicie.

Este mismo escenario, pero reemplazando startActivity() con startService() , es por eso que tuve que escribir WakefulIntentService , que utiliza un WakeLock para asegurar que el dispositivo permanezca despierto el tiempo suficiente para que haga su trabajo, luego libera el WakeLock .

  • Obtener información de rotación automática en Android
  • Activar la pantalla en el dispositivo
  • ¿Cómo abrir la última pantalla de preferencias usadas?
  • Tamaño de pantalla Honeycomb Menu android
  • ¿Previene el bloqueo de la pantalla en atenuación / espera mientras usa la aplicación android?
  • Android Development: Cambio del brillo de la pantalla en el servicio
  • Cómo evitar la captura de pantalla en Android
  • ¿Qué tamaños de pantalla son necesarios para dispositivos móviles android y ios?
  • Archivo en blanco se guarda cuando se utiliza screencap programatically en Android
  • La actividad de Android no llenará la pantalla WVGA
  • Android, mdpi densidad pero diferentes pantallas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.