當咱們須要控制某個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; } }