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

文章讨论了在集成FloatingWindow时遇到的问题,即页面在后台和前台切换时,回调顺序错误。问题源于对Activity生命周期的监听和setFilter方法的使用。解决方案是通过FloatWindow.setFilter方法精确控制悬浮窗在特定活动上显示或隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值