Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,14 @@ setMoveStyle 方法可设置动画效果,只在 MoveType.slide 或 MoveType.ba

**更新日志**
--

**v1.0.10**

分离生命周期和创建浮动框,需要在Application中注册生命周期。
这样就可以在用到浮动框的地方才去创建浮动框。
解决必须在Application中创建浮动框,否则会出问题的bug。

在Applicaion中先注册生命周期:FloatWindow.initLifecycle(this);

**v1.0.9**

修复拖动点击事件冲突
Expand Down
57 changes: 31 additions & 26 deletions floatwindow/src/main/java/com/yhao/floatwindow/FloatLifecycle.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -17,29 +19,34 @@
* 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<IFloatWindowImpl> set = new HashSet<>();

FloatLifecycle(Context applicationContext, boolean showFlag, Class[] activities, LifecycleListener lifecycleListener) {
this.showFlag = showFlag;
this.activities = activities;
public static void register(IFloatWindowImpl floatWindow){
set.add(floatWindow);
}

public static void unregister(IFloatWindowImpl floatWindow){
set.remove(floatWindow);
}

public FloatLifecycle(Context applicationContext) {
num++;
mLifecycleListener = lifecycleListener;
mHandler = new Handler();
((Application) applicationContext).registerActivityLifecycleCallbacks(this);
applicationContext.registerReceiver(this, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
Expand All @@ -49,18 +56,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) {
Expand All @@ -72,11 +82,7 @@ public void onActivityResumed(Activity activity) {
}
}
resumeCount++;
if (needShow(activity)) {
mLifecycleListener.onShow();
} else {
mLifecycleListener.onHide();
}
showOrHide(activity);
if (appBackground) {
appBackground = false;
}
Expand All @@ -90,11 +96,10 @@ public void onActivityPaused(final Activity activity) {
public void run() {
if (resumeCount == 0) {
appBackground = true;
mLifecycleListener.onBackToDesktop();
onBackToDesktop();
}
}
}, delay);

}

@Override
Expand All @@ -107,7 +112,7 @@ public void onActivityStarted(Activity activity) {
public void onActivityStopped(Activity activity) {
startCount--;
if (startCount == 0) {
mLifecycleListener.onBackToDesktop();
onBackToDesktop();
}
}

Expand All @@ -117,7 +122,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();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -35,7 +33,6 @@ public class IFloatWindowImpl extends IFloatWindow {
private boolean mClick = false;
private int mSlop;


private IFloatWindowImpl() {

}
Expand All @@ -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
Expand Down Expand Up @@ -120,6 +97,7 @@ void dismiss() {
if (mB.mViewStateListener != null) {
mB.mViewStateListener.onDismiss();
}
FloatLifecycle.unregister(this);
}

@Override
Expand Down Expand Up @@ -299,4 +277,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();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down