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 の設計は合理的ですが、少なくとも通常の表示と非表示が直接保証される必要があります。