Android 在服务中创建另一个WindowManager弹出窗口(对话框)之前,如何关闭该弹出窗口?

Android 在服务中创建另一个WindowManager弹出窗口(对话框)之前,如何关闭该弹出窗口?,android,service,broadcastreceiver,android-windowmanager,Android,Service,Broadcastreceiver,Android Windowmanager,每次错过呼叫时,我都会显示WindowManager弹出窗口(对话框)。当出现超过1次未接来电时,关闭按钮不起作用以关闭WindowManager弹出窗口(对话框)。为什么不工作,以及如何在创建新窗口之前关闭上一个WindowManager弹出窗口(对话框)。下面是我创建WindowManager弹出窗口(对话框)的代码。我在我的服务类中创建它。每当我错过电话,我就开始服务课 ////// show dialog... public void dialogIncomingRingScreen(S

每次错过呼叫时,我都会显示WindowManager弹出窗口(对话框)。当出现超过1次未接来电时,关闭按钮不起作用以关闭WindowManager弹出窗口(对话框)。为什么不工作,以及如何在创建新窗口之前关闭上一个WindowManager弹出窗口(对话框)。下面是我创建WindowManager弹出窗口(对话框)的代码。我在我的服务类中创建它。每当我错过电话,我就开始服务课

////// show dialog...
public void dialogIncomingRingScreen(String namee){


    windowManager2 = (WindowManager)getSystemService(WINDOW_SERVICE);

    LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view=layoutInflater.inflate(R.layout.pup_up_incoming_miss_end_call, null);
    params=new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity= Gravity.CENTER|Gravity.CENTER;
    params.x=0;
    params.y=0;
    windowManager2.addView(view, params);

    view.setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = params.x;
                    initialY = params.y;
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();
                    return true;
                case MotionEvent.ACTION_UP:
                    return true;
                case MotionEvent.ACTION_MOVE:
                    if(view !=null) {
                        params.x = initialX + (int) (event.getRawX() - initialTouchX);
                        params.y = initialY + (int) (event.getRawY() - initialTouchY);
                        windowManager2.updateViewLayout(view, params);
                    }
                    return true;
            }
            return false;
        }
    });


    callBtn = (Button) view.findViewById(R.id.buttonCall);
    callBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:"+number));
            startActivity(callIntent);
            clearView(v.getContext());
            stopSelf();
        }
    });
    messageBtn  = (Button)view.findViewById(R.id.buttonMessage);
    messageBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Intent intent = new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse("smsto:" + Uri.encode(number)));
            startActivity(intent);
            clearView(v.getContext());
            stopSelf();
        }
    });
    viewContactBtn = (Button)view.findViewById(R.id.buttonView);
    viewContactBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context context = InComingCallEndServices.this;
            ContentResolver contentResolver = context.getContentResolver();

            Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

            String[] projection = new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID};

            Cursor cursor =
                    contentResolver.query(
                            uri,
                            projection,
                            null,
                            null,
                            null);

            if(cursor!=null) {
                while(cursor.moveToNext()){
                    String contactName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
                    String contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    Uri urir = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactId));
                    intent.setData(urir);
                    context.startActivity(intent);
                }
                cursor.close();
            }



            clearView(v.getContext());
            stopSelf();

        }
    });
    txtNameIncoming = (TextView)view.findViewById(R.id.txtIncomingName);
    txtNameIncoming.setText(namee);

    txtIncomingnumber = (TextView)view.findViewById(R.id.textViewNumber);
    txtIncomingnumber.setText(number);
    btnClose = (Button) view.findViewById(R.id.buttonClose);

    btnClose.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            clearView(v.getContext());
      stopSelf();
        }
    });
    TextView logtxt = view.findViewById(R.id.textViewLastCall);
    txtAddress = view.findViewById(R.id.txtAddress);
    txtAddress.setText(countryCode(number));
    String num = getCallDetails();
    if(num!=null){
        logtxt.setText(num);
    }else {
        logtxt.setText("sss");
    }
}
下面的代码用于关闭WindowManager弹出窗口(对话框)


您需要WindowManager 2.addView来做什么?只需在
活动中执行UI部分,并在此处显示
警报对话框
/
Snackbar
/(无论什么),因为我认为您的新视图覆盖了以前的视图。尝试调试
clearView()
方法。除此之外,为什么不开始一个带有
FLAG\u Activity\u EXCLUDE\u from\u RECENTS
singleTop
的活动呢。易于处理和构建。添加之前,请尝试检查并删除已添加的视图,或者您可以调用
clearView(上下文)method@AmjadKhan你的答案对我有用。谢谢,我需要WindowManager。现在它对我有用了。
public static void clearView(Context context) {
    windowManager2 = (WindowManager) context.getSystemService(WINDOW_SERVICE);
    if(view != null) {
        if(view.isEnabled()){
            windowManager2.removeView(view);

            view = null;

        }
    }
}