/**
* 前后台切换判定逻辑:
* 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);
}
}
Android准确判断App前后台切换
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1.判断进程是否存在 2.判断服务是否存在 3.app是否在前台 4.手机锁 5.系统app 参考
- 前言 在API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期...
- 需要根据监听 App 前后台切换,看到一篇不错的文章,转换成Kotlin代码,记录如下: 在Application...
- 在某些特定场景下,我们需要判断App是否处于后台运行状态,常见如:推送或聊天消息是否需要显示到通知栏中、设置手势密...
- 简书更新下载:【简书Android 1.10.4更新/下载链接】 现在我们的活动 给简书app写评论送优惠码!送简...