进程相关→ProcessUtils

 
   
  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 android.support.annotation.NonNull;
   
  import java.util.Arrays;
  import java.util.Collections;
  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 final 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>
  *
  * @return 前台应用包名
  */
  public static String getForegroundProcessName() {
  ActivityManager manager = (ActivityManager) Utils.getContext().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 = Utils.getContext().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(Utils.getContext().getPackageName(), 0);
  AppOpsManager aom = (AppOpsManager) Utils.getContext().getSystemService(Context.APP_OPS_SERVICE);
  if (aom.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) != AppOpsManager.MODE_ALLOWED) {
  Utils.getContext().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) Utils.getContext().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>
  *
  * @return 后台服务进程
  */
  public static Set<String> getAllBackgroundProcesses() {
  ActivityManager am = (ActivityManager) Utils.getContext().getSystemService(Context.ACTIVITY_SERVICE);
  List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();
  Set<String> set = new HashSet<>();
  for (ActivityManager.RunningAppProcessInfo info : infos) {
  Collections.addAll(set, info.pkgList);
  }
  return set;
  }
   
  /**
  * 杀死所有的后台服务进程
  * <p>需添加权限 {@code <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>}</p>
  *
  * @return 被暂时杀死的服务集合
  */
  public static Set<String> killAllBackgroundProcesses() {
  ActivityManager am = (ActivityManager) Utils.getContext().getSystemService(Context.ACTIVITY_SERVICE);
  List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();
  Set<String> set = new HashSet<>();
  for (ActivityManager.RunningAppProcessInfo info : infos) {
  for (String pkg : info.pkgList) {
  am.killBackgroundProcesses(pkg);
  set.add(pkg);
  }
  }
  infos = am.getRunningAppProcesses();
  for (ActivityManager.RunningAppProcessInfo info : infos) {
  for (String pkg : info.pkgList) {
  set.remove(pkg);
  }
  }
  return set;
  }
   
  /**
  * 杀死后台服务进程
  * <p>需添加权限 {@code <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>}</p>
  *
  * @param packageName 包名
  * @return {@code true}: 杀死成功<br>{@code false}: 杀死失败
  */
  public static boolean killBackgroundProcesses(@NonNull String packageName) {
  ActivityManager am = (ActivityManager) Utils.getContext().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;
  }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值