获取前台进程包名(ForegroundProcess)
来源:互联网 发布:何炅情商知乎 编辑:程序博客网 时间:2024/06/16 22:31
获取前台进程包名(ForegroundProcess)
在之前我们可以通过下面的方式获取到前台进程的包名
public String getForegroundApp(Context context) { ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); if (mActivityManager.getRunningTasks(1) == null) { return null; } ActivityManager.RunningTaskInfo mRunningTask = mActivityManager.getRunningTasks(1).get(0); if (mRunningTask == null) { return null; } String pkgName = mRunningTask.topActivity.getPackageName(); return pkgName; }
最新的Android版本中google已经收紧权限了,只能获取到自己APP的进程信息,所以我们可以通过下面的方式获取前台进程。
public static String getForegroundApp() { File[] files = new File("/proc").listFiles(); int lowestOomScore = Integer.MAX_VALUE; String foregroundProcess = null; for (File file : files) { if (!file.isDirectory()) { continue; } int pid; try { pid = Integer.parseInt(file.getName()); } catch (NumberFormatException e) { continue; } try { String cgroup = read(String.format("/proc/%d/cgroup", pid)); String[] lines = cgroup.split("\n"); String cpuSubsystem = null; String cpuaccctSubsystem = null; // 我们取cpu和cpuacct两行数据 for (String s : lines) { if (s.contains(":cpu:")) { cpuSubsystem = s; } if (s.contains(":cpuacct:")) { cpuaccctSubsystem = s; } } if (!cpuaccctSubsystem.endsWith(Integer.toString(pid))) { // not an application process continue; } if (cpuSubsystem.endsWith("bg_non_interactive")) { // background policy continue; } int uid = Integer.parseInt(cpuaccctSubsystem.split(":")[2] .split("/")[1].replace("uid_", "")); if (uid >= 1000 && uid <= 1038) { // system process continue; } int appId = uid - AID_APP; int userId = 0; // loop until we get the correct user id. // 100000 is the offset for each user. while (appId > AID_USER) { appId -= AID_USER; userId++; } if (appId < 0) { continue; } // u{user_id}_a{app_id} is used on API 17+ for multiple user // account support. // String uidName = String.format("u%d_a%d", userId, appId); File oomScoreAdj = new File(String.format( "/proc/%d/oom_score_adj", pid)); if (oomScoreAdj.canRead()) { String str = read(oomScoreAdj.getAbsolutePath()); int oomAdj = Integer.valueOf(str); if (oomAdj != 0) { continue; } } String cmdline = read(String.format("/proc/%d/cmdline", pid)); if (cmdline.contains("com.android.systemui") || cmdline.contains("dirac")) { continue; } int oomscore = Integer.parseInt(read(String.format( "/proc/%d/oom_score", pid))); if (oomscore < lowestOomScore) { lowestOomScore = oomscore; foregroundProcess = cmdline; } } catch (IOException e) { e.printStackTrace(); } } return foregroundProcess; } private static String read(String path) throws IOException { StringBuilder output = new StringBuilder(); BufferedReader reader = new BufferedReader(new FileReader(path)); output.append(reader.readLine()); for (String line = reader.readLine(); line != null; line = reader .readLine()) { output.append('\n').append(line); } reader.close(); return output.toString().trim();// 不调用trim(),包名后会带有乱码 }
当然该方法也有缺点,就是需要进行IO操作,所以速度会比较慢。
0 0
- 获取前台进程包名(ForegroundProcess)
- Android获取前台进程包名
- 获取前台应用包名 终极解决方案
- android 5.0以上获取前台应用的包名
- 根据包名获取进程pid
- 获取Android进程中的包名
- Android6.0及后续版本拿不到Top Activity, 但能拿到前台进程包名
- android 5.0获取前台应用的包名的实现方法
- 获取apk包名
- 根据进程名获取窗体名
- AU3-进程名获取窗口名
- 通过包名获取程序名类
- android中获取包名,类名
- Android获取前台进程技术方案
- 内核获取进程名KeGetProcName
- 通过PID获取进程名
- 通过EPROCESS获取进程名
- 获取apk的包名
- Unix System brief structure
- keil数据类型占用的字节数
- Cocos error:Invalid indirect reference 0x62687930 in decodeIndirectRef
- 399. Evaluate Division
- C#中的分支结构:if..else if 、if... else 和 switch ...case语句的区别
- 获取前台进程包名(ForegroundProcess)
- Ubuntu16.04安装mysql
- 响应式开发(四)-----Bootstrap CSS----------Bootstrap CSS概览和相关注意事项
- 最小公倍数,最大公约数C语言(全)
- iOS开发之数据转模型(runtime)
- 10494Uva(二)高精度运算 易错点
- md5加密
- android 权限
- vue-cli