Android: how to show dialogue or activity on the lock screen [do not unlock the screen]

I have an application, it will receive a message from the server and make a dialog to the user. Therefore, when the phone is on the lock screen, I want the dialog to appear at the top of the lock screen, but not unlock it. Can anyone give me a suggestion?

+8
android
source share
3 answers
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); } 
+11
source share

I decided something similar as follows. Create services to broadcast the action " ACTION_SCREEN_ON and ACTION_USER_PRESENT and ACTION_SCREEN_OFF ", create a function to show windows using WINDOW_SERVICE . I use the service for my requirements, but it can adapt.

 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(); } } }; } 

Hope this is helpful!

+11
source share

Finally, I have achieved the same. Do not go for activity, because Android will not display a lock screen for your activity for security reasons, so use the service instead of Activity.

Below is my code in my service's onStartCommand

 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); 

And add <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> to display

+8
source share

All Articles