Android开发过程中经常遇到需要判断某个应用是否在前台,应该怎么实现呢?
我尝试的可行方法有两种:
一、通过dumpsys信息判断
开发定位是一般是通过dumpsys window | grep mCurrentFocus这个命令判断的,那么可以让程序也这样干活的
代码如下:
@Override
public String getCurrentTopPackage() {
String packageName = "";
try {
String command[] = new String[]{"sh", "-c", "dumpsys window | grep mCurrentFocus"};
//"dumpsys window | grep mCurrentFocus"
Process process = Runtime.getRuntime().exec(command);
int code = process.waitFor();
Log.d(TAG, "code : " + code);
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
BufferedReader successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
Log.d(TAG, "successMsg : " + successMsg);
Log.d(TAG, "errorMsg : " + errorMsg);
String content = successMsg.toString();
if (content.contains("mCurrentFocus")) {
int indexA = content.lastIndexOf(" ");
int indexB = content.lastIndexOf("}");
packageName = content.substring(indexA + 1, indexB);
Log.d(TAG, "content : " + packageName);
return packageName.trim();
}
} catch (Exception e) {
Log.e(TAG, "getCurrentTopPackage", e);
e.printStackTrace();
}
return packageName.trim();
}
二、使用IProcessObserver
参照Android源码中NFC、CarService的例子,使用IProcessObserver 监听
IProcessObserver 定义如下:
根据这个方法来实现相关代码,采用这个方法不仅可以判断前台应用是哪个,还可以根据应用的进程状态变化执行相关动作,比如内存清理回收等
厉害了啊,以后还是多看Android源码吧
read the fucking code