当咱们须要控制某个APP的时候,就须要知道这个APP当前的状态;
java
首先要开容许检测,关闭进程的权限,在manifests中配置:android
<!--杀死第三方应用的权限--> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <!--获取TASKS权限--> <uses-permission android:name="android.permission.GET_TASKS" />
有两种方式:app
一、遍历栈里面的应用,对比是否有相同的APP应用code
/** * APP是否正在运行 * * @param context 应用上下文 * @param packageName APP的包名 * @return */ public static boolean isAppRunning(Context context, String packageName) { boolean isAppRunning = false; ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> list = activityManager.getRunningTasks(100); for (ActivityManager.RunningTaskInfo info : list) { if (info.topActivity.getPackageName().equals(packageName) || info.baseActivity.getPackageName().equals(packageName)) { isAppRunning = true; SkyLogger.d(TAG, info.topActivity.getPackageName() + " info.baseActivity.getPackageName()=" + info.baseActivity.getPackageName()); break; } } return isAppRunning; }
二、检测是否正在运行进程
/** * APP是否正在运行 * * @param context 应用上下文 * @param packageName APP的包名 * @return */ public static boolean isAppOnForeground(Context context, String packageName) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses(); if (appProcessInfos == null) { SkyLogger.d(TAG, "appProcessInfos == null"); return false; } for (RunningAppProcessInfo appProcess : appProcessInfos) { if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) { SkyLogger.d(TAG, "正在后台运行"); return true; } } ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity; String currentPackageName = cn.getPackageName(); if (!TextUtils.isEmpty(currentPackageName) && packageName.equals(currentPackageName)) { SkyLogger.d(TAG, "正在前台运行"); return true; } SkyLogger.d(TAG, "没有运行"); return false; }
杀死某个应用get
/** * 强制关闭应用 * * @param context 应用上下文 * @param packageName 关闭的APP的包名 */ public static void closeDeviceApp(Context context, String packageName) { if (packageName != null && context != null) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityManager.killBackgroundProcesses(packageName); SkyLogger.d(TAG, packageName + " is killed."); } else { SkyLogger.d(TAG, "packageName is null."); } }
若是仅仅只是检测该APP是否运行,可参照以下方法:it
/** * APP是否正在运行 * * @param context 应用上下文 * @param packageName APP的包名 * @return */ public static boolean isAppOnForeground(Context context, String packageName) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses(); //通常不会跑到这里来,若是跑到这里来的话,要么就是这个app废了,要不就是见鬼了。。 if (appProcessInfos == null) { SkyLogger.d(TAG, "appProcessInfos == null"); return false; } else { for (RunningAppProcessInfo appProcess : appProcessInfos) { if (appProcess.processName.equals(packageName)) { SkyLogger.d(TAG, packageName+"正在后台运行..."); return true; } } return false; } }