在我们做一些应用的时候 ,往往会有一些需求,需要判断当前应用在前台还是在后台,让后一些操作,比如重新登陆,提示弹框什么的 这样就需要我们来做一些判断了 下面是我写的一些方法
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 就处于前台
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(); }