有很多场景需要判断当前应用是在前台还是后台,比如收到消息后,如果在前台可能就不展示了,但是如果在后台,就要通知用户去浏览。那有哪些方式去判断当前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,导致判断不准确。
网友评论