提起监测Android前后台切换的监测,网上查询,下面的方案应该会被看到:
public class MainApplication extends Application {
private int count = 0;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStopped(Activity activity) {
Log.v("LifecycleCallbacks", activity + "onActivityStopped");
count--;
if (count == 0) {
Log.v("LifecycleCallbacks", ">>>>>>>>>>>>>>>>>>>切到后台 lifecycle");
}
}
@Override
public void onActivityStarted(Activity activity) {
Log.v("LifecycleCallbacks", activity + "onActivityStarted");
if (count == 0) {
Log.v("LifecycleCallbacks", ">>>>>>>>>>>>>>>>>>>切到前台 lifecycle");
}
count++;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Log.v("LifecycleCallbacks", activity + "onActivityCreated");
}
@Override
public void onActivityResumed(Activity activity) {
Log.v("LifecycleCallbacks", activity + "onActivityResumed");
}
@Override
public void onActivityPaused(Activity activity) {
Log.v("LifecycleCallbacks", activity + "onActivityPaused");
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
Log.v("LifecycleCallbacks", activity + "onActivitySaveInstanceState");
}
@Override
public void onActivityDestroyed(Activity activity) {
Log.v("LifecycleCallbacks", activity + "onActivityDestroyed");
}
});
}
}
上面的方案在大多数情况下是没有问题,问题在于当需要支持水平模式时该方法就失效了。当我们旋转设备时activity将会重建,onStart方法将被再次调用,这时将会错误的判断为app第二次被打开。所以若是APP支持水平模式,则不能采用这个办法。
新方案
其实判断APP是否切换到后台的方法很简单:
只要判断前一个页面退出后有没有新页面进入即可,如果有新页面进入那么则App保持在前台,如果没有新页面进入,那么则表明App此刻进入了后台。
这里涉及到几个问题:
1.采用何种方式监测Activity状态变化:基类方式还是Application里面?
2.在哪些方法里面做手脚:不用说,肯定是onStart和onStop
3.怎么判断前一个页面结束之后后一个页面进入?
问题1很简单,肯定是采用Application,因为可能会有第三方Activity被调起,如果采用基类方式,是无法监测第三方Activity的状态变化的,剩下的就是问题3了,方案是这样的,在前一页面结束后,开始计时,在有限时间内,新页面如果没有出现,那么就认为App进入了后台,否则则继续保持在前台。
具体方案参考这个链接即可了(https://github.com/hehonghui/android-tech-frontier/blob/master/issue-8/%E6%A3%80%E6%B5%8BAndroid%E5%BA%94%E7%94%A8%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E5%85%B3%E9%97%AD.md)