From dcfa311383157cfd778b96b974112227330d6868 Mon Sep 17 00:00:00 2001 From: "bangyue.zou" Date: Thu, 29 Aug 2019 21:00:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=20=E5=88=86=E7=A6=BB=E7=94=9F=E5=91=BD?= =?UTF-8?q?=E5=91=A8=E6=9C=9F=E5=92=8C=E5=88=9B=E5=BB=BA=E6=B5=AE=E5=8A=A8?= =?UTF-8?q?=E6=A1=86=EF=BC=8C=E9=9C=80=E8=A6=81=E5=9C=A8Application?= =?UTF-8?q?=E4=B8=AD=E6=B3=A8=E5=86=8C=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E3=80=82=20=20=E8=BF=99=E6=A0=B7=E5=B0=B1=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=9C=A8=E7=94=A8=E5=88=B0=E6=B5=AE=E5=8A=A8=E6=A1=86=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E6=96=B9=E6=89=8D=E5=8E=BB=E5=88=9B=E5=BB=BA=E6=B5=AE?= =?UTF-8?q?=E5=8A=A8=E6=A1=86=E3=80=82=20=20=E8=A7=A3=E5=86=B3=E5=BF=85?= =?UTF-8?q?=E9=A1=BB=E5=9C=A8Application=E4=B8=AD=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=B5=AE=E5=8A=A8=E6=A1=86=EF=BC=8C=E5=90=A6=E5=88=99=E4=BC=9A?= =?UTF-8?q?=E5=87=BA=E9=97=AE=E9=A2=98=E7=9A=84bug=E3=80=82=20=20=E5=9C=A8?= =?UTF-8?q?Applicaion=E4=B8=AD=E5=85=88=E6=B3=A8=E5=86=8C=E7=94=9F?= =?UTF-8?q?=E5=91=BD=E5=91=A8=E6=9C=9F=EF=BC=9AFloatWindow.initLifecycle(t?= =?UTF-8?q?his);?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++- .../com/yhao/floatwindow/FloatLifecycle.java | 53 ++++++++++--------- .../com/yhao/floatwindow/FloatWindow.java | 9 ++++ .../yhao/floatwindow/IFloatWindowImpl.java | 47 ++++++++-------- .../yhao/floatwindow/BaseApplication.java | 2 + 5 files changed, 68 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index e15aab7..dcc5c5d 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,14 @@ setMoveStyle 方法可设置动画效果,只在 MoveType.slide 或 MoveType.ba **更新日志** -- - +**v1.0.10** + + 分离生命周期和创建浮动框,需要在Application中注册生命周期。 + 这样就可以在用到浮动框的地方才去创建浮动框。 + 解决必须在Application中创建浮动框,否则会出问题的bug。 + + 在Applicaion中先注册生命周期:FloatWindow.initLifecycle(this); + **v1.0.9** 修复拖动点击事件冲突 diff --git a/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java b/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java index 6639043..997a150 100644 --- a/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java +++ b/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java @@ -8,7 +8,9 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; -import android.widget.Toast; + +import java.util.HashSet; +import java.util.Set; /** * Created by yhao on 17-12-1. @@ -17,29 +19,30 @@ * 1.startCount计数,针对back到桌面可以及时隐藏 * 2.监听home键,从而及时隐藏 * 3.resumeCount计时,针对一些只执行onPause不执行onStop的奇葩情况 + * + * modify by bond on 2019-08-29 解耦和{@link IFloatWindowImpl} */ -class FloatLifecycle extends BroadcastReceiver implements Application.ActivityLifecycleCallbacks { +public class FloatLifecycle extends BroadcastReceiver implements Application.ActivityLifecycleCallbacks { private static final String SYSTEM_DIALOG_REASON_KEY = "reason"; private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; private static final long delay = 300; private Handler mHandler; - private Class[] activities; - private boolean showFlag; private int startCount; private int resumeCount; private boolean appBackground; - private LifecycleListener mLifecycleListener; private static ResumedListener sResumedListener; private static int num = 0; + private static Set set = new HashSet<>(); + + public static void register(IFloatWindowImpl floatWindow){ + set.add(floatWindow); + } - FloatLifecycle(Context applicationContext, boolean showFlag, Class[] activities, LifecycleListener lifecycleListener) { - this.showFlag = showFlag; - this.activities = activities; + public FloatLifecycle(Context applicationContext) { num++; - mLifecycleListener = lifecycleListener; mHandler = new Handler(); ((Application) applicationContext).registerActivityLifecycleCallbacks(this); applicationContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); @@ -49,18 +52,21 @@ public static void setResumedListener(ResumedListener resumedListener) { sResumedListener = resumedListener; } - private boolean needShow(Activity activity) { - if (activities == null) { - return true; - } - for (Class a : activities) { - if (a.isInstance(activity)) { - return showFlag; + public void showOrHide(Activity activity){ + for(IFloatWindowImpl window : set){ + if(window.needShow(activity)){ + window.show(); + } else { + window.hide(); } } - return !showFlag; } + public void onBackToDesktop(){ + for(IFloatWindowImpl window : set){ + window.onBackToDesktop(); + } + } @Override public void onActivityResumed(Activity activity) { @@ -72,11 +78,7 @@ public void onActivityResumed(Activity activity) { } } resumeCount++; - if (needShow(activity)) { - mLifecycleListener.onShow(); - } else { - mLifecycleListener.onHide(); - } + showOrHide(activity); if (appBackground) { appBackground = false; } @@ -90,11 +92,10 @@ public void onActivityPaused(final Activity activity) { public void run() { if (resumeCount == 0) { appBackground = true; - mLifecycleListener.onBackToDesktop(); + onBackToDesktop(); } } }, delay); - } @Override @@ -107,7 +108,7 @@ public void onActivityStarted(Activity activity) { public void onActivityStopped(Activity activity) { startCount--; if (startCount == 0) { - mLifecycleListener.onBackToDesktop(); + onBackToDesktop(); } } @@ -117,7 +118,7 @@ public void onReceive(Context context, Intent intent) { if (action != null && action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) { - mLifecycleListener.onBackToDesktop(); + onBackToDesktop(); } } } diff --git a/floatwindow/src/main/java/com/yhao/floatwindow/FloatWindow.java b/floatwindow/src/main/java/com/yhao/floatwindow/FloatWindow.java index bc57903..bdcb943 100644 --- a/floatwindow/src/main/java/com/yhao/floatwindow/FloatWindow.java +++ b/floatwindow/src/main/java/com/yhao/floatwindow/FloatWindow.java @@ -1,6 +1,7 @@ package com.yhao.floatwindow; import android.animation.TimeInterpolator; +import android.app.Application; import android.content.Context; import android.support.annotation.LayoutRes; import android.support.annotation.MainThread; @@ -16,9 +17,17 @@ /** * Created by yhao on 2017/12/22. * https://github.com/yhaolpz + * + * modify by bond on 2019-08-29 分离生命周期注册和浮动框创建逻辑。这样就可以在用到浮动框的地方才去创建浮动框。 + * 解决必须在Application中创建浮动框,否则会出问题的bug. */ public class FloatWindow { + static FloatLifecycle floatLifecycle; + + public static void initLifecycle(Application application){ + floatLifecycle = new FloatLifecycle(application); + } private FloatWindow() { diff --git a/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java b/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java index 65f222e..2b0bec3 100644 --- a/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java +++ b/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java @@ -7,6 +7,7 @@ import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; +import android.app.Activity; import android.os.Build; import android.view.MotionEvent; import android.view.View; @@ -19,11 +20,8 @@ */ public class IFloatWindowImpl extends IFloatWindow { - - private FloatWindow.B mB; private FloatView mFloatView; - private FloatLifecycle mFloatLifecycle; private boolean isShow; private boolean once = true; private ValueAnimator mAnimator; @@ -35,7 +33,6 @@ public class IFloatWindowImpl extends IFloatWindow { private boolean mClick = false; private int mSlop; - private IFloatWindowImpl() { } @@ -55,27 +52,7 @@ private IFloatWindowImpl() { mFloatView.setSize(mB.mWidth, mB.mHeight); mFloatView.setGravity(mB.gravity, mB.xOffset, mB.yOffset); mFloatView.setView(mB.mView); - mFloatLifecycle = new FloatLifecycle(mB.mApplicationContext, mB.mShow, mB.mActivities, new LifecycleListener() { - @Override - public void onShow() { - show(); - } - - @Override - public void onHide() { - hide(); - } - - @Override - public void onBackToDesktop() { - if (!mB.mDesktopShow) { - hide(); - } - if (mB.mViewStateListener != null) { - mB.mViewStateListener.onBackToDesktop(); - } - } - }); + FloatLifecycle.register(this); } @Override @@ -299,4 +276,24 @@ private void cancelAnimator() { } } + public boolean needShow(Activity activity) { + if (mB.mActivities == null) { + return true; + } + for (Class a : mB.mActivities) { + if (a.isInstance(activity)) { + return mB.mShow; + } + } + return !mB.mShow; + } + + public void onBackToDesktop() { + if (!mB.mDesktopShow) { + hide(); + } + if (mB.mViewStateListener != null) { + mB.mViewStateListener.onBackToDesktop(); + } + } } diff --git a/sample/src/main/java/com/example/yhao/floatwindow/BaseApplication.java b/sample/src/main/java/com/example/yhao/floatwindow/BaseApplication.java index a1310b1..1613712 100644 --- a/sample/src/main/java/com/example/yhao/floatwindow/BaseApplication.java +++ b/sample/src/main/java/com/example/yhao/floatwindow/BaseApplication.java @@ -32,6 +32,8 @@ public void onCreate() { ImageView imageView = new ImageView(getApplicationContext()); imageView.setImageResource(R.drawable.icon); + // 分离生命周期和创建浮动框 + FloatWindow.initLifecycle(this); FloatWindow .with(getApplicationContext()) .setView(imageView) From bdd09d97f4d4779b1c64052edf14f62729cef13e Mon Sep 17 00:00:00 2001 From: baneyue <904674153@qq.com> Date: Fri, 30 Aug 2019 12:26:40 +0800 Subject: [PATCH 2/3] Update IFloatWindowImpl.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化浮框消耗时的内存泄漏 --- .../src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java b/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java index 2b0bec3..98ea317 100644 --- a/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java +++ b/floatwindow/src/main/java/com/yhao/floatwindow/IFloatWindowImpl.java @@ -97,6 +97,7 @@ void dismiss() { if (mB.mViewStateListener != null) { mB.mViewStateListener.onDismiss(); } + FloatLifecycle.unregister(this); } @Override From 86c249edaa5f537e8a03b3a9e427090e072d0d2d Mon Sep 17 00:00:00 2001 From: baneyue <904674153@qq.com> Date: Fri, 30 Aug 2019 12:27:21 +0800 Subject: [PATCH 3/3] Update FloatLifecycle.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决浮框销毁的内存泄漏 --- .../src/main/java/com/yhao/floatwindow/FloatLifecycle.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java b/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java index 997a150..379a0be 100644 --- a/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java +++ b/floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java @@ -40,6 +40,10 @@ public class FloatLifecycle extends BroadcastReceiver implements Application.Act public static void register(IFloatWindowImpl floatWindow){ set.add(floatWindow); } + + public static void unregister(IFloatWindowImpl floatWindow){ + set.remove(floatWindow); + } public FloatLifecycle(Context applicationContext) { num++;