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
- Android AndroidUtilCode-进程相关工具类
- Android AndroidUtilCode-Activity相关工具类
- Android开发常用工具类AndroidUtilCode
- Android开发常用工具类AndroidUtilCode
- 分享一个整理了很多Android开发工具类的链接AndroidUtilCode
- android进程相关的工具类AppUtils
- 进程相关工具类
- AndroidUtilCode
- AndroidUtilCode
- Android:屏幕相关工具类
- Android App相关工具类
- android屏幕相关工具类
- Android进程相关资料
- android 进程相关
- android系统进程手机内存工具类
- Android进程管理之工具类taskutils
- Android工具类--网络相关类
- android网络相关的工具类
- html中报错:xxx is not a function
- 设计原则之开放-封闭原则 javascript
- 调试技巧之调用堆栈 - Call stack
- 获得应用需要的所有权限并查看是否授权
- Jquery 获取复选框的值
- Android AndroidUtilCode-进程相关工具类
- 轻松搞定AIDL
- MySQL数据库(入门资料文档下载分享)
- javascript的正则表达式
- codevs 1332 上白泽慧音(Tarjan)
- C++里的花括号{},块,作用域
- 归并排序求逆序对
- Boost学习之可移植路径操作--filesystem
- i.MX6ULL -- 架构图