2012-03-31 22 views
6

empiezo una actividad desde un BroadcastReceiver, que se desencadena por un alaram (tipo RTC_WAKEUP). en onCreate de que la actividad añado estas banderasFLAG_TURN_SCREEN_ON no siempre funciona

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 (casos aproximadamente el 10%) de la pantalla no se enciende. la alarma se activa correctamente (aquí el sonido de una notificación, que también se activa 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 instantáneamente. que, el botón de encendido funciona bien. esto suceda 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 el uso de PowerManager, ya que necesita un permiso, y las banderas son la preferida manera.

lo que podría ser un problema? logcat no muestra ningún problema ...

+0

se las arregló para eludir el problema? – Redwarp

+0

@Redwarp La única solución fue usar un permiso WAKE_LOCK y usar un bloqueo estático. Hay un nuevo 'WakefulBroadcastReceiver' en la biblioteca de soporte, que maneja el bloqueo parcial de activación. Necesita el permiso de cource. – shelll

Respuesta

3

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

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

Este mismo escenario, pero sustituyendo startActivity() con startService(), es por lo que tenía que escribir WakefulIntentService, que utiliza un WakeLock para asegurar que el dispositivo se mantiene despierto el tiempo suficiente para que haga su trabajo, entonces libera la WakeLock.

+0

el dispositivo debe estar despierto, porque se está reproduciendo el sonido de la notificación. ... ¿podría poner el receptor a dormir con Thread.sleep (...) y el dispositivo no se dormirá? o con un mensaje retrasado (new Handler()). postDelayed (...))? – shelll

+0

@shelll: "¿podría poner el receptor a dormir con Thread.sleep (...) y el dispositivo no se quedará dormido?" -- no. Primero, eso evitará que su actividad se inicie hasta después de que 'sleep()' complete, porque se llama a 'onReceive()' en el hilo principal de la aplicación. En segundo lugar, Android matará a su 'BroadcastReceiver' si vincula el hilo de la aplicación principal durante demasiado tiempo. "¿podría poner el receptor a dormir con Thread.sleep (...) y el dispositivo no se quedará dormido?" - eso no evitará que el dispositivo se quede dormido. Aumentaría la frecuencia de este problema un poco. – CommonsWare

+0

OK, entonces no sleep(), pero ¿cómo podría escuchar el sonido de notificación (lo repito hasta que se cancele manualmente), pero la pantalla no se enciende? – shelll

5

Llego un poco tarde a la fiesta aquí, pero he estado luchando con esto por un tiempo y finalmente encontré la manera de desbloquear la pantalla todo el tiempo. Agrego los indicadores en el evento onAttachToWindow(). Normalmente hago esto desde un WakefulBroadcastReceiver para que la pantalla se transmita sin problemas, pero eso depende del uso.

@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); 
} 
5

Desde mi experiencia y la investigación sobre este tema:

  • El FLAG_TURN_SCREEN_ON no puede ser utilizado para encender la pantalla y fuera varias veces en su aplicación.

  • El FLAG_TURN_SCREEN_ON sólo se puede utilizar una vez para encender la pantalla cuando creating a new activity (preferiblemente en el método onCreate()) o when re-creating a view.

Ahora, puede superar esta limitación por:

  • El lanzamiento de una nueva actividad y el establecimiento del indicador allí, entonces terminar la actividad (por el usuario o mediante programación) para permitir el giro de la pantalla apagado.
  • Configurando los parámetros params.screenBrightness en as "dim" as possible, a veces la pantalla "aparece DESACTIVADA". A continuación, puede aumentar el brillo para "encender" la pantalla.Sin embargo, esto a menudo no funciona, ya que la pantalla todavía es débil pero visible, y tampoco funciona si el usuario bloquea el teléfono.
  • Usando el Power Manager Wakelock (esto sigue funcionando pero Android ha dejado de utilizar esta funcionalidad, por lo que desaconseja el uso de esta técnica). Sin embargo, hasta donde puedo decir, esta es la única forma en que puedo hacer que mi aplicación encienda y apague la pantalla de manera confiable.

Ninguno de estos son ideales (de hecho, se sienten como hacks) pero simplemente use el que mejor se adapte a las necesidades de su aplicación.

Puede leer más aquí:

Cuestiones relacionadas