Creating a system overlay window (always on top)

前端 未结 16 976
南方客
南方客 2020-11-21 07:07

I\'m trying to create an always-op-top button/clickable-image which stays on top of all the windows all the time.

The proof of concept is

  • here - Smar
16条回答
  •  囚心锁ツ
    2020-11-21 07:38

    by using service you can achieve this :

    public class PopupService extends Service{
    
        private static final String TAG = PopupService.class.getSimpleName();
        WindowManager mWindowManager;
        View mView;
        String type ;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    //        registerOverlayReceiver();
            type = intent.getStringExtra("type");
            Utils.printLog("type = "+type);
            showDialog(intent.getStringExtra("msg"));
            return super.onStartCommand(intent, flags, startId);
        }
    
        private void showDialog(String aTitle)
        {
            if(type.equals("when screen is off") | type.equals("always"))
            {
                Utils.printLog("type = "+type);
                PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
                WakeLock mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
                mWakeLock.acquire();
                mWakeLock.release();
            }
    
            mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            mView = View.inflate(getApplicationContext(), R.layout.dialog_popup_notification_received, null);
            mView.setTag(TAG);
    
            int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels / 2;
    
            LinearLayout dialog = (LinearLayout) mView.findViewById(R.id.pop_exit);
    //        android.widget.LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) dialog.getLayoutParams();
    //        lp.topMargin = top;
    //        lp.bottomMargin = top;
    //        mView.setLayoutParams(lp);
    
            final EditText etMassage = (EditText) mView.findViewById(R.id.editTextInPopupMessageReceived);
    
            ImageButton imageButtonSend = (ImageButton) mView.findViewById(R.id.imageButtonSendInPopupMessageReceived);
    //        lp = (LayoutParams) imageButton.getLayoutParams();
    //        lp.topMargin = top - 58;
    //        imageButton.setLayoutParams(lp);
            imageButtonSend.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Utils.printLog("clicked");
    //                mView.setVisibility(View.INVISIBLE);
                    if(!etMassage.getText().toString().equals(""))
                    {
                        Utils.printLog("sent");
                        etMassage.setText("");
                    }
                }
            });
    
            TextView close = (TextView) mView.findViewById(R.id.TextViewCloseInPopupMessageReceived);
            close.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    hideDialog();   
                }
            });
    
            TextView view = (TextView) mView.findViewById(R.id.textviewViewInPopupMessageReceived);
            view.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    hideDialog();   
                }
            });
    
            TextView message = (TextView) mView.findViewById(R.id.TextViewMessageInPopupMessageReceived);
            message.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);
            mWindowManager.addView(mView, mLayoutParams);
            mWindowManager.updateViewLayout(mView, mLayoutParams);
    
        }
    
        private void hideDialog(){
            if(mView != null && mWindowManager != null){
                mWindowManager.removeView(mView);
                mView = null;
            }
        }
    }
    

提交回复
热议问题