第一种思路是如果该应用在运行,则拿到那个应用进程的信息,然后用这个等式
appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
来判断它是否在前台。
</pre><pre code_snippet_id="655671" snippet_file_name="blog_20150429_4_9223919" name="code" class="java"> /** * 程序是否在前台运行 * * @return */ public static boolean isAppOnForeground(Context context) { ActivityManager activityManager = (ActivityManager) context .getApplicationContext().getSystemService( Context.ACTIVITY_SERVICE); String packageName = context.getApplicationContext().getPackageName(); List<RunningAppProcessInfo> appProcesses = activityManager .getRunningAppProcesses();// 在后台运行的程序 if (appProcesses == null) return false; for (RunningAppProcessInfo appProcess : appProcesses) { // The name of the process that this object is associated with. if (appProcess.processName.equals(packageName) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; }
第二种是利用getRunningTasks拿到最近运行的一个activity task的信息,按照getRunningTasks的api介绍:
Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.
说明存放task的机制是类似于栈的,所以这个方法拿到的顺序是 “最近加进来的task先被拿到,最先加进去的task被压在栈底最后才被拿到”。
而这个方法的完整声明是:
public List<RunningTaskInfo> getRunningTasks(int maxNum)
传进去的参数是最多拿多少个task,那我们这里只拿最新的一个task就可以。
拿到最新的一个task,然后又拿这个task最顶端的那个activity,即
tasks.get(0).topActivity
如果这个activity的包名是我们当前程序的名字,说明这个程序目前就是在前台了。
/** * 判断当前应用程序处于前台还是后台 * * @return 后台为true,前台为false */ public static boolean isApplicationBroughtToBackground(final Context context) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasks = am.getRunningTasks(1); if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { return true; } } return false; }
无码无真相。
http://download.csdn.net/detail/aishang5wpj/8645505