¿Cómo puedo crear una actividad visible en la parte superior de la pantalla de bloqueo

Estoy recibiendo una notificación C2DM entrante mientras la pantalla está bloqueada. Me gustaría despertar la pantalla y mostrar el mensaje de notificación en la parte superior de la pantalla de bloqueo con una actividad. Estoy lanzando la actividad de notificación de mi C2DM BroadcastReceiver de la siguiente manera:

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 del método onCreate de la actividad de notificación, despierto 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 se ha despertado, pero la actividad de notificación no es visible hasta que desbloqueo la pantalla.

Me doy cuenta de que puedo evitar la pantalla de bloqueo con el código de abajo, pero eso no es deseado. Quiero que el usuario desbloquee el teléfono, sólo 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 ); 

Esto no es posible hasta donde yo sepa. Parece que está intentando replicar las experiencias de iOS. Usted debe darse cuenta de que android tiene sus propias convenciones y violarlos no es algo que debe hacer a la ligera.

Android es un poco de una contradicción. Es muy abierto y como desarrollador tienes acceso a cualquier cosa, y depende de ti usar esos poderes para bien o para mal. Cuando digo mal no me refiero al malware. Me refiero a las aplicaciones que tratan de obtener linda y utilizar las cosas de manera que no estaban destinados a ser utilizados, como poner en las notificaciones pidiendo que utilice la aplicación más. 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 ellos. La pantalla de bloqueo es una de esas partes. Puedes reemplazar tu aplicación de inicio todo lo que quieras, pero nunca tendrás que preocuparte por la falla de tu pantalla de bloqueo de reemplazo y evitar que accedas a tu teléfono.

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

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

Sus peticiones suenan en conflicto conmigo: usted dice que desea que la actividad aparezca en la parte superior de la pantalla de bloqueo (de hecho no lo hacemos, esconder la pantalla de bloqueo para que la actividad se puede ver), mientras que al mismo tiempo que Desea que el usuario primero tenga que desbloquear el dispositivo.

Si usted está pensando que desea que el usuario vea una notificación antes de desbloquear el dispositivo para ver su actividad … Realmente creo que usted no quiere que. La notificación es muy pequeña (en la barra de estado en la parte superior), y la siguiente que se muestra al publicarlo es muy transitoria. Esto no va a ser una buena experiencia para alguien que escuchó el tono de su teléfono o zumbido y lo está sacando para ver lo que está pasando.

Debe utilizar cualquier combinación de los indicadores de ventana que tengan sentido para su aplicación. Usted puede obtener prácticamente cualquier comportamiento razonable entre las diversas combinaciones de ellos. Estos se utilizan para el despertador, la llamada entrante UI, etc

Prueba esto en tu 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.. 

Espero que esto ayude

  • WebViewClient shouldInterceptRequest Congela el WebView
  • Excepción SQLite: la base de datos está bloqueada
  • Android libc.so accidente?
  • La aplicación se bloquea cuando la aplicación se reanuda durante mucho tiempo
  • ¿Cómo desactivar el bloqueo de teclado y mostrar una actividad al usuario cuando se dispara el receptor de SCREEN_ON?
  • Cómo bloquear una llamada de número móvil y recepción de mensajes en el desarrollo de aplicaciones Android?
  • ¿Cómo detectar si PIN / contraseña / patrón es necesario para desbloquear el teléfono?
  • Cómo saber si el usuario está en la pantalla de bloqueo desde el servicio
  • La aplicación de geofencing de Android se estrella al inicio
  • Problemas con los permisos de Android bluetooth
  • ¿Cómo puedo bloquear archivos en android usando código java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.