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

后端 未结 3 924
野趣味
野趣味 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 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!

提交回复
热议问题