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 过滤器,用于指定在哪些界面显示悬浮窗,默认全部界面都显示
         *
         * @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) は、
対応するアクティビティを表示する必要があるかどうかをフィルターします。

ps: setFilter の設計は合理的ですが、少なくとも通常の表示と非表示が直接保証される必要があります。

おすすめ

転載: blog.csdn.net/ganshenml/article/details/131671263