Android监测前后台切换

提起监测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)

推荐阅读更多精彩内容