原因主要看各个组件的生命周期来看问题
public void closeWin(ParamType type) {
if(type == ParamType.FLOAT_WIN_TOOLS) {
wm.removeViewImmediate(mContentView);
Log.d(TAG, "closeWin: mContentView");
isShowing = false;
}else if(type == ParamType.FLOAT_WIN_SMALL) {
wm.removeViewImmediate(mContentSmallView);
isShowing = false;
}
mContentView = null;
binding = null;
mContentSmallView = null;
binding2 = null;
}
提示这个FloatWin 内存泄漏,然后找问题
1,首先可能会想到context
默认可能需要用到最长生命周期的,和打开窗体的service同步
但是context 是APP context
就没办法了
2,提示布局泄漏
重点关注布局
猜测可能是remove 后并未回收,然后被后台打开悬浮窗口的service 占用Floatwin 占用 布局的对象
3,所以
所以需要了解到这个代码区别
wm.removeViewImmediate(mContentView); // 1
wm.removeView(mContentView); // 2
经过百度发现
1 是同步删除,这个是我需要的
在关闭窗体的时候立刻移除
但是又想错了
同步删除 == 不显示窗体
和mContentView 泄漏没关系
所以最后是在show的时候创建布局,在close的时候销毁对象(赋值为null)
或者可以使用弱引用
完美解决
特别注意空指针异常