为什么当我完成活动时,带有TYPE_APPLICATION_OVERLAY的窗口没有关闭?



I需要Manifest.permission.SYSTEM_ALERT_WINDOW作为Float窗口,并通过启动FloatWindowManager.getInstance().applyOrShowFloatWindow(FloatWindowActivity.this);从"活动"打开该窗口

浮动窗口工作良好。

我认为当我通过启动finish();完成活动时,浮动将关闭

但事实上,即使"活动"已关闭,浮动窗口仍在倾斜,为什么?

public class FloatWindowActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_show_or_apply).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FloatWindowManager.getInstance().applyOrShowFloatWindow(FloatWindowActivity.this);
}
});
findViewById(R.id.btn_dismiss).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FloatWindowManager.getInstance().dismissWindow();
}
});

findViewById(R.id.btn_Close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

浮动

public class FloatWindowManager { 
...
private void showWindow(Context context) {
if (!isWindowDismiss) {
Log.e(TAG, "view is already added here");
return;
}
isWindowDismiss = false;
if (windowManager == null) {
windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
}
Point size = new Point();
windowManager.getDefaultDisplay().getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;
mParams = new WindowManager.LayoutParams();
mParams.packageName = context.getPackageName();
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
int mType;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
mType = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
}
mParams.type = mType;
mParams.format = PixelFormat.RGBA_8888;
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mParams.x = screenWidth - dp2px(context, 100);
mParams.y = screenHeight - dp2px(context, 171);
floatView = new AVCallFloatView(context);
floatView.setParams(mParams);
floatView.setIsShowing(true);
windowManager.addView(floatView, mParams);
}
...
}

您已经在其他窗口或视图上绘制了浮动窗口。当它启动时,它没有依赖关系。所以我建议你取消能见度。

在浮动窗口管理器中创建一个函数并隐藏可见性

floatView.setVisibility(View.GONE);

我认为它会起作用。

您需要使用windowManager:手动删除floatView

//Check if the view is still attached to window, otherwise it will throw an exception
if (floatView.getParent() != null) {
windowManager.removeView(floatView);
}

最新更新