1.问题背景
集成了FloatingWindow,想在页面退到后台时显示,回到前台时因此,但是后者时机调用时回调日志先收到onHide,接着里面onShow。很明显,只调用了hide方法,为什么会如此?
查看日志,在onHide日志输出时有如下:
EditFloatWindow com.** D onHide
ZrHung.AppEyeUiProbe com.** D restart watching
EditFloatWindow com.** D onShow
这个ZrHung.AppEyeUiProbe 是什么?
2.问题分析
通过日志可以看到应该时有回调onShow()
进而发现IFloatWindowImpl中的回调:
new FloatLifecycle(mB.mApplicationContext, mB.mShow, mB.mActivities, new LifecycleListener() {
@Override
public void onShow() {
show();
}
很明显要追踪FloatLifecycle。
@Override
public void onActivityResumed(Activity activity) {
if (sResumedListener != null) {
num--;
if (num == 0) {
sResumedListener.onResumed();
sResumedListener = null;
}
}
resumeCount++;
if (needShow(activity)) {
mLifecycleListener.onShow();
} else {
mLifecycleListener.onHide();
}
if (appBackground) {
appBackground = false;
}
}
private boolean needShow(Activity activity) {
if (activities == null) {
return true;
}
for (Class a : activities) {
if (a.isInstance(activity)) {
return showFlag;
}
}
return !showFlag;
}
原来时监听activity的生命周期来进行判断回调。
这个activity就是:
/**
* 设置 Activity 过滤器,用于指定在哪些界面显示悬浮窗,默认全部界面都显示
*
* @param show 过滤类型,子类类型也会生效
* @param activities 过滤界面
*/
public B setFilter(boolean show, @NonNull Class... activities) {
mShow = show;
mActivities = activities;
return this;
}
通过FloatWindow中的setFilter来实现。
3.解决方案
FloatWindow.setFilter(false, context.javaClass)
过滤对应的activity是否需要显示。
ps:虽然setFilter的设计固然有其道理,但至少要直接保证能正常show & hide。