Android : How to show dialog or activity over lock screen[ not unlock the screen]

后端 未结 3 922
野趣味
野趣味 2020-12-23 17:58

I hava a app, it will receive msg from server and make a dialog to user.So when phone is on lock screen i want dialog will show on the top of lock screen but not unlock it.c

相关标签:
3条回答
  • 2020-12-23 18:48

    Finally I achieved the same. Don't go for activity, because android will not show lock screen behind your activity for security reason, so use service instead of Activity.

    Below is my code in onStartCommand of my service

    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 manifest

    0 讨论(0)
  • 2020-12-23 19:00
    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);
    }
    
    0 讨论(0)
  • 2020-12-23 19:01

    I solved something similar in the following way. Create services, to broadcast the action "ACTION_SCREEN_ON & ACTION_USER_PRESENT & ACTION_SCREEN_OFF", create function to show the windows with WINDOW_SERVICE. I use a 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();
                }
            }
        };
    }
    

    I hope it useful!

    0 讨论(0)
提交回复
热议问题