您的位置:首页 > 移动开发

android5.1+获取当前运行的app

2016-07-12 09:32 387 查看
本博客来自于:http://www.itnose.net/detail/6464581.html


android5.1+获取当前运行的app

本人试了,华为5.1是可以的。酷派4.1是不可以的。

/** first app user */
public static final int AID_APP = 10000;
/** offset for uid ranges for each user */
public static final int AID_USER = 100000;
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;
      String cpuaccctSubsystem;
      
      if (lines.length == 2) {//有的手机里cgroup包含2行或者3行,我们取cpu和cpuacct两行数据
      cpuSubsystem = lines[0];
      cpuaccctSubsystem = lines[1];
      }else if(lines.length==3){
      cpuSubsystem = lines[0];
      cpuaccctSubsystem = lines[2];
      }else {
continue;
}
      if (!cpuaccctSubsystem.endsWith(Integer.toString(pid))) {
        // not an application process
        continue;
      }
      if (cpuSubsystem.endsWith("bg_non_interactive")) {
        // background policy
        continue;
      }
      String cmdline = read(String.format("/proc/%d/cmdline", pid));
      if (cmdline.contains("com.android.systemui")) {
        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()) {
        int oomAdj = Integer.parseInt(read(oomScoreAdj.getAbsolutePath()));
        if (oomAdj != 0) {
          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(),包名后面会带有乱码
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: