2011-02-15 13 views
11

Recibo una notificación de C2DM entrante mientras la pantalla está bloqueada. Me gustaría reactivar la pantalla y mostrar el mensaje de notificación en la parte superior de la pantalla de bloqueo mediante una Actividad. Estoy lanzando la Actividad de la notificación de mi C2DM BroadcastReceiver de la siguiente manera:Cómo creo una actividad que esté visible en la parte superior de la pantalla de bloqueo

Intent new_intent= new Intent().setClass(context, EIAlertDialog.class);   
new_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
new_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
context.startActivity(new_intent); 

y dentro método onCreate de la Actividad de la notificación, que active la pantalla de la siguiente manera:

PowerManager powerManager= (PowerManager)getSystemService(Context.POWER_SERVICE); 
if (!powerManager.isScreenOn()) { 
    mWakeLock= powerManager.newWakeLock(
        PowerManager.FULL_WAKE_LOCK | 
        PowerManager.ACQUIRE_CAUSES_WAKEUP, 
        "My Tag") 
    mWakeLock.acquire(); 
} 

La pantalla es despertado, pero la actividad de notificación no está visible hasta que desbloquee la pantalla.

Me doy cuenta de que puedo evitar la pantalla de bloqueo con el siguiente código, pero eso no es lo deseado. Quiero que el usuario desbloquee el teléfono, solo si él/ella está interesado en leer/responder a la notificación.

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

Parece que está usando Android.Sería una buena idea agregar la etiqueta de Android para que más personas puedan ver su pregunta. – f20k

+0

@ f20k, sí, es Android, thx –

Respuesta

0

Utiliza las banderas es la forma correcta de hacerlo, utilizando el administrador de energía es incorrecto.

Tus solicitudes me parecen contradictorias: dices que quieres que la actividad aparezca en la parte superior de la pantalla de bloqueo (de hecho, no hacemos eso, ocultamos la pantalla de bloqueo para que se pueda ver la actividad), mientras al mismo tiempo que desea que el usuario primero tenga que desbloquear el dispositivo.

Si crees que quieres que el usuario vea una notificación antes de desbloquear el dispositivo para ver tu actividad ... Realmente creo que no quieres eso. La notificación es muy pequeña (en la barra de estado en la parte superior), y la siguiente que se muestra al publicarla es muy transitoria. Esta no será una buena experiencia para alguien que escuchó un pitido o un zumbido de su teléfono y lo está sacando para ver qué está pasando.

Debe usar la combinación de los indicadores de ventana que tengan sentido para su aplicación. Puede obtener casi cualquier comportamiento razonable entre las diversas combinaciones de ellos. Estos se utilizan para el despertador, la interfaz de usuario de la llamada entrante, etc.

+0

Estoy tratando de imitar el comportamiento del iPhone. Cuando el teléfono está dormido, una notificación entrante despierta el teléfono y muestra la notificación en una ventana emergente, pero no desbloquea el teléfono. Si el usuario desbloquea el teléfono, se abre la aplicación de destino para la notificación. –

+0

, así que quiero que el usuario vea la notificación antes de desbloquear el dispositivo, simplemente no en la barra de estado, más como un mensaje de Toast. –

1

Esto no es posible, hasta donde yo sé. Parece que estás intentando replicar las experiencias de iOS. Debes darte cuenta de que Android tiene sus propias convenciones y violarlas no es algo que debas hacer a la ligera.

Android es un poco contradictorio. Es muy abierto y como desarrollador tiene acceso a cualquier cosa, y depende de usted usar esos poderes para bien o para mal. Cuando digo mal no me refiero al malware. Me refiero a las aplicaciones que intentan ser tiernas y usan las cosas de forma distinta a como estaban destinadas a ser utilizadas, como la colocación de notificaciones que le piden que use más la aplicación. La contradicción es que en realidad no tienes acceso a todo, hay algunas partes que los desarrolladores decidieron que eran tan importantes que la aplicación no podía meterse con ellas. La pantalla de bloqueo es una de esas partes. Puede reemplazar la aplicación de su hogar todo lo que quiera, pero nunca tendrá que preocuparse de que la pantalla de reemplazo de reemplazo falle y le impida el acceso a su teléfono.

Incluso si esto fuera posible, tendría más problemas para tratar. Cada pantalla de bloqueo es diferente, los fabricantes pueden personalizarla, por lo que no tiene garantías de que su actividad no interfiera con el desbloqueo del teléfono.

0

probar este en su actividad

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

    boolean screenOn = pm.isScreenOn();//check id screen is on 

    if(!screenOn){//if not turn it on or wkaeup the screen 

     final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Screen On"); 
     wl.acquire(); 
     Toast.makeText(getBaseContext(), "This is WAKEUP SCREEN", Toast.LENGTH_SHORT).show(); 
     Thread timer = new Thread(){ 
      public void run(){ 
       try { 
        sleep(5000); 
       } catch (InterruptedException e) { 
        // TODO: handle exception 
       }finally{ 
        wl.release();// release wakelock important 
       } 
      } 
     }; 
     timer.start(); 
    } 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);//keep the activity running under lock screen.. 

Esperanza esto ayuda

+0

¿Seguro que esto funciona? –

+0

Sí, lo estoy usando en mi aplicación. aunque el 'WakeLock' está en servicio. –

+0

No funciona en Android 5 o posterior – trampster

Cuestiones relacionadas