获取前台应用包名,在5.0.1的系统版本号可以通过系统提供的方法去获取前台包名,网上也有很多代码,这里就不重复贴代码了。以下贴出一个链接分享,其中还包括了获取系统pid 与uid的方式间接判断前台包名的方法。
还有一篇是一个老外发现的方法,不过此方法还是不靠谱,本人亲测5.0.1以上的系统完美解决此问题。但是。。。但是。。。 5.0以下的系统是没有提供pid的,所以也不能做到通用,最后还是pass。
下面贴出实现代码:
/**
* Created by zhu on 2016/6/15.
*/
public class SuperRunningPackage {
/** 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() {
Log.e("PKG","VersionCode:"+Build.VERSION.SDK_INT);
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;
for (int i = 0; i < lines.length; i++) {
Log.e("PKG",lines[i]);
}
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 if(lines.length == 5){//6.0系统
cpuSubsystem = lines[2];
cpuaccctSubsystem = lines[4];
}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;
foregroundPro