判断当前应用是否在前台

在我们做一些应用的时候 ,往往会有一些需求,需要判断当前应用在前台还是在后台,让后一些操作,比如重新登陆,提示弹框什么的    这样就需要我们来做一些判断了  下面是我写的一些方法 

RunningTask

原理:
当一个 App 处于前台的时候,会处于 RunningTask 的这个栈的栈顶,所以我们可以取出 RunningTask 的栈顶的任务进程,看他与我们的想要判断的 App 的包名是否相同,来达到效果

缺点:
getRunningTask 方法在 Android5.0 以上已经被废弃,只会返回自己和系统的一些不敏感的 task,不再返回其他应用的 task,用此方法来判断自身 App 是否处于后台,仍然是有效的,但是无法判断其他应用是否位于前台,因为不再能获取信息

public boolean isRunningForground(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    ComponentName componentName = activityManager.getRunningTasks(1).get(0).topActivity;
    String pakagename = componentName.getPackageName();
    if (!TextUtils.isEmpty(pakagename) && pakagename.equals(getPackageName())) {
        return true;
    }
    return false;
}

RunningProcess

原理
通过 runningProcess 获取到一个当前正在运行的进程的 List,我们找到与想要判断app包名一样的进程并判断这个进程的 importance 属性是否是前台进程,如果是那这个 App 就处于前台

 public static boolean isBackground(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_BACKGROUND) {
                    Log.i(
"后台", appProcess.processName);
                   
return true;
                }
else{
                    Log.i(
"前台", appProcess.processName);
                   
return false;
                }
            }
        }
       
return false;
    }

当返回true的是否说明当前应用是在前台,否则在后台;如何使用呢   

 根据activity的生命周期

判断当前应用是否在前台

具体实现思路是通过重写Activity的onResume方法和onStop方法实现,即在onStop里判断应用是否切换到后台,在onResume里判断是否切换到前台。

@Override
protected void onResume() {
    super.onResume();
    Toast.makeText(MainActivity.this,"前台"+isRunningForground(MainActivity.this),Toast.LENGTH_SHORT).show();
}



@Override
    protected void onStop() {
    super.onStop();
    Toast.makeText(MainActivity.this, "后台" + isRunningForground(MainActivity.this), Toast.LENGTH_SHORT).show();
}