看来Google终于关闭了获取当前前景应用程序包的所有门。
棒棒糖更新后,该消息被杀死getRunningTasks(int maxNum)
,这要归功于此答案,,我使用了以下代码来获取自Lollipop以来的前台应用程序包:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == PROCESS_STATE_TOP) {
currentInfo = app;
break;
}
}
}
return currentInfo;
Android 5.1.1及更高版本(6.0棉花糖),似乎已被杀死 getRunningAppProcesses()
了。现在,它将返回您自己的应用程序包的列表。
UsageStatsManager
我们可以UsageStatsManager
按此处所述使用新的API,但它不适用于所有应用程序。某些系统应用程序将返回相同的程序包
com.google.android.googlequicksearchbox
无障碍服务(2017年12月:将被Google禁止使用)
一些应用程序使用了AccessibilityService
(如此处所示),但是它有一些缺点。
有没有其他方法来获取当前正在运行的应用程序包?
ps
在shell 中运行的输出,并且策略为"fg"
和内容/proc/[pid]/oom_adj_score
等于,0
则该应用为前台应用。不幸的是,它似乎/proc/[pid]/oom_adj_score
在Android 6.0上不再可读。gist.github.com/jaredrummler/7d1498485e584c8a120e