Android AndroidUtilCode-进程相关工具类

来源:互联网 发布:万网域名增加二级 编辑:程序博客网 时间:2024/05/18 00:01

进程相关工具类

功能:

1.获取前台线程包名

2.杀死后台服务进程

3.杀死后台服务进程(需要包名)

<span style="font-size:18px;">package com.blankj.utilcode.utils;import android.app.ActivityManager;import android.app.AppOpsManager;import android.app.usage.UsageStats;import android.app.usage.UsageStatsManager;import android.content.Context;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.provider.Settings;import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Set;/** * <pre> *     author: Blankj *     blog  : http://blankj.com *     time  : 2016/10/18 *     desc  : 进程相关工具类 * </pre> */public class ProcessUtils {    private ProcessUtils() {        throw new UnsupportedOperationException("u can't instantiate me...");    }    /**     * 获取前台线程包名     * <p>当不是查看当前App,且SDK大于21时,     * 需添加权限 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>}</p>     *     * @param context 上下文     * @return 前台应用包名     */    public static String getForegroundProcessName(Context context) {        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> infos = manager.getRunningAppProcesses();        if (infos != null && infos.size() != 0) {            for (ActivityManager.RunningAppProcessInfo info : infos) {                if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {                    return info.processName;                }            }        }        if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) {            PackageManager packageManager = context.getPackageManager();            Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);            List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);            System.out.println(list);            if (list.size() > 0) {// 有"有权查看使用权限的应用"选项                try {                    ApplicationInfo info = packageManager.getApplicationInfo(context.getPackageName(), 0);                    AppOpsManager aom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);                    if (aom.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) != AppOpsManager.MODE_ALLOWED) {                        context.startActivity(intent);                    }                    if (aom.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) != AppOpsManager.MODE_ALLOWED) {                        LogUtils.d("getForegroundApp", "没有打开\"有权查看使用权限的应用\"选项");                        return null;                    }                    UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);                    long endTime = System.currentTimeMillis();                    long beginTime = endTime - 86400000 * 7;                    List<UsageStats> usageStatses = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, endTime);                    if (usageStatses == null || usageStatses.isEmpty()) return null;                    UsageStats recentStats = null;                    for (UsageStats usageStats : usageStatses) {                        if (recentStats == null || usageStats.getLastTimeUsed() > recentStats.getLastTimeUsed()) {                            recentStats = usageStats;                        }                    }                    return recentStats == null ? null : recentStats.getPackageName();                } catch (PackageManager.NameNotFoundException e) {                    e.printStackTrace();                }            } else {                LogUtils.d("getForegroundApp", "无\"有权查看使用权限的应用\"选项");            }        }        return null;    }    /**     * 杀死后台服务进程     * <p>需添加权限 {@code <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>}</p>     *     * @param context 上下文     * @return 杀死后台进程数     */    public static int killAllBackgroundProcesses(Context context) {        int count = 0;        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();        if (infos == null || infos.size() == 0) return 0;        Set<String> set = new HashSet<>();        for (ActivityManager.RunningAppProcessInfo info : infos) {            for (String pkg : info.pkgList) {                am.killBackgroundProcesses(pkg);                set.add(pkg);                ++count;            }        }        infos = am.getRunningAppProcesses();        if (infos == null || infos.size() == 0) return count;        for (ActivityManager.RunningAppProcessInfo info : infos) {            for (String pkg : info.pkgList) {                set.remove(pkg);                --count;            }        }        return count;    }    /**     * 杀死后台服务进程     * <p>需添加权限 {@code <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>}</p>     *     * @param context     上下文     * @param packageName 包名     * @return {@code true}: 杀死成功<br>{@code false}: 杀死失败     */    public static boolean killBackgroundProcesses(Context context, String packageName) {        if (StringUtils.isSpace(packageName)) return false;        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();        if (infos == null || infos.size() == 0) return true;        for (ActivityManager.RunningAppProcessInfo info : infos) {            if (Arrays.asList(info.pkgList).contains(packageName)) {                am.killBackgroundProcesses(packageName);            }        }        infos = am.getRunningAppProcesses();        if (infos == null || infos.size() == 0) return true;        for (ActivityManager.RunningAppProcessInfo info : infos) {            if (Arrays.asList(info.pkgList).contains(packageName)) {                return false;            }        }        return true;    }}</span>


0 0