android app切换后台,Android准确判断App前后台切换

/**

* 前后台切换判定逻辑:

* 1、连续2次stop

* 2、如果连续stop之前有连续start,需要用连续stop次数减去连续start次数

* 只有start、stop才是进入和退出一个页面的判定节点,resume、pause都不行

*/

public class AppBackgroundManager {

/** 一些状态基用于判断用户是否在前台 **/

private boolean isAppForeground = false;

private int mActivityStated;

private final int STATE_OPEN = 0;

private final int STATE_RESUMED = 1;

private final int STATE_STOPPED = 2;

private IAppStateChangeListener mListener;

private AtomicBoolean mLastResume = new AtomicBoolean(false);//上一次是否调用resume方法

private AtomicInteger mMultiStart = new AtomicInteger(0);

private String mLastStartActivityName;//上一次触发resume的页面

static final AppBackgroundManager mInstance = new AppBackgroundManager();

private AppBackgroundManager() {

}

public static AppBackgroundManager getInstance() {

return mInstance;

}

/**

* 在Application的onActivityStarted中调用

*/

public void onActivityStarted(String activityName) {

//如果跟上一次是同一个activity,则不认为是多次resume

boolean isTheSame = StringUtil.getNotNullStr(activityName).equals(mLastStartActivityName);

if (!isTheSame && mLastResume.get()) {

mMultiStart.incrementAndGet();

}

mLastStartActivityName = activityName;

mLastResume.set(true);

if (!isAppForeground) {//如果是切换进前台

mActivityStated = STATE_OPEN;//第一次打开状态

onAppForegroundStateChange(true);

} else {

mActivityStated = STATE_RESUMED;

}

isAppForeground = true;

}

/**

* 在Application的onActivityStopped中调用

*/

public void onActivityStopped() {//连续两次stop会触发进入后台,如果是程序本身快速关闭两个页面导致的连续stop,需要过滤掉

if (mMultiStart.get() > 1) {//上一次是stop,且上一次之前有连续多次不同activity的resume

mMultiStart.decrementAndGet();

return;

}

mLastResume.set(false);

if (mActivityStated == STATE_RESUMED) { //可以理解为最新的Activity在应用内

mActivityStated = STATE_STOPPED;

return;

}

if (isAppForeground) {

mMultiStart.set(0);

isAppForeground = false;

onAppForegroundStateChange(false);

}

}

public boolean isAppOnForeground() {

return isAppForeground;

}

//App前后台切换

private void onAppForegroundStateChange(boolean isAppForeground) {

if (mListener == null) {

return;

}

mListener.onAppStateChanged(isAppForeground);

}

public void setAppStateListener(IAppStateChangeListener listener) {

mListener = listener;

}

public interface IAppStateChangeListener {

void onAppStateChanged(boolean isAppForceground);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值