Android故事Android知识Android开发

注册Activity生命周期判断当前应用前后台

2017-02-09  本文已影响52人  骑着海去看蜗牛

有很多场景需要判断当前应用是在前台还是后台,比如收到消息后,如果在前台可能就不展示了,但是如果在后台,就要通知用户去浏览。那有哪些方式去判断当前App是在前台或后台呢?

经典的方式

public static boolean isAppForeground(Context context) {
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(context.getPackageName())) {
                if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    TQLog.e(TAG, "isRunningForeground ");
                    return true;
                } else {
                    TQLog.e(TAG, "isRunningBackground " + appProcess.importance);
                    return false;
                }
            }
        }
        return false;
    }

上面的方式是过去经典的判断应用位于前后台的方式,但是在有多系统上,比如三星4.3的系统上,也会出现错误,不管应用在前后台,返回的值都是应用在前台。

原理
通过runningProcess获取到一个当前正在运行的进程的List,我们遍历这个List中的每一个进程,判断这个进程的一个importance 属性是否是前台进程,并且包名是否与我们判断的APP的包名一样,如果这两个条件都符合,那么这个App就处于前台

缺点:
在聊天类型的App中,常常需要常驻后台来不间断的获取服务器的消息,这就需要我们把Service设置成START_STICKY,kill 后会被重启(等待5秒左右)来保证Service常驻后台。如果Service设置了这个属性,这个App的进程就会被判断是前台,代码上的表现就是appProcess.importance的值永远是 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,这样就永远无法判断出到底哪个是前台了。

通过ActivityLifecycleCallbacks来判断当前App在前后台

Android4.0以后,系统推出了ActivityLifecycleCallbacks来监听Activity的生命周期,这给我们实现监听当前App前后台提供了一种思路。通过定义一个变量来记录Activity的生命周期,因为Activity启动会执行onStarted,在关闭活着到后台时会执行onStopped,所以不用关心是哪个Activity触发的App到后台,只需要通过生命周期去判断是否在前后台即可。

ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        }

        @Override
        public void onActivityStopped(Activity activity) {
            mAppCount--;
        }

        @Override
        public void onActivityStarted(Activity activity) {
            mAppCount++;
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    };

在onStart中mAppCount++而不在onCreate中注册是因为用户横竖屏导致重新实例化会先触发onStop再触发onStart,导致判断不准确。

上一篇下一篇

猜你喜欢

热点阅读