Android: Cómo mostrar el diálogo o la actividad sobre la pantalla de bloqueo

Me hava una aplicación, recibirá msg del servidor y hacer un diálogo a user.So cuando el teléfono está en la pantalla de bloqueo quiero diálogo se mostrará en la parte superior de la pantalla de bloqueo, pero no desbloquear it.could alguien me da sugerencia?

public void onAttachedToWindow() { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); } 

Resolví algo similar de la siguiente manera. Crear servicios, para transmitir la acción " ACTION_SCREEN_ON & ACTION_USER_PRESENT & ACTION_SCREEN_OFF ", crear función para mostrar las ventanas con WINDOW_SERVICE . Yo uso un servicio para mis necesidades, pero se puede adaptar.

 public class OverlayService extends Service { private static final String TAG = OverlayService.class.getSimpleName(); WindowManager mWindowManager; View mView; Animation mAnimation; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { registerOverlayReceiver(); return super.onStartCommand(intent, flags, startId); } private void showDialog(String aTitle){ mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mView = View.inflate(getApplicationContext(), R.layout.fragment_overlay, null); mView.setTag(TAG); int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels / 2; RelativeLayout dialog = (RelativeLayout) mView.findViewById(R.id.dialog); LayoutParams lp = (LayoutParams) dialog.getLayoutParams(); lp.topMargin = top; lp.bottomMargin = top; mView.setLayoutParams(lp); ImageButton imageButton = (ImageButton) mView.findViewById(R.id.close); lp = (LayoutParams) imageButton.getLayoutParams(); lp.topMargin = top - 58; imageButton.setLayoutParams(lp); imageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mView.setVisibility(View.INVISIBLE); } }); TextView title = (TextView) mView.findViewById(R.id.Title); title.setText(aTitle); final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, 0, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON , PixelFormat.RGBA_8888); mView.setVisibility(View.VISIBLE); mAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.in); mView.startAnimation(mAnimation); mWindowManager.addView(mView, mLayoutParams); } private void hideDialog(){ if(mView != null && mWindowManager != null){ mWindowManager.removeView(mView); mView = null; } } @Override public void onDestroy() { unregisterOverlayReceiver(); super.onDestroy(); } private void registerOverlayReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(overlayReceiver, filter); } private void unregisterOverlayReceiver() { hideDialog(); unregisterReceiver(overlayReceiver); } private BroadcastReceiver overlayReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(TAG, "[onReceive]" + action); if (action.equals(Intent.ACTION_SCREEN_ON)) { showDialog("Esto es una prueba y se levanto desde"); } else if (action.equals(Intent.ACTION_USER_PRESENT)) { hideDialog(); } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { hideDialog(); } } }; } 

Espero que sea útil!

Finalmente logré lo mismo. No vaya a la actividad, porque Android no mostrará la pantalla de bloqueo detrás de su actividad por razones de seguridad, así que utilice el servicio en lugar de Actividad.

A continuación se muestra mi código en onStartCommand de mi servicio

 WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); View mView = mInflater.inflate(R.layout.score, null); WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */, PixelFormat.RGBA_8888); mWindowManager.addView(mView, mLayoutParams); 

Y agrega <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> para manifestar

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.