FloatWindow 如何做到退到后台页面显示回到前台隐藏

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。

猜你喜欢

转载自blog.csdn.net/ganshenml/article/details/131671263