Здається, Google нарешті закрив усі двері для отримання поточного пакету програм переднього плану.
Після оновлення Lollipop, яке вбило 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
AccessibilityService (грудень 2017 року: заборонено використовувати Google)
Деякі програми використовують AccessibilityService
(як це бачимо тут ), але це має деякі недоліки.
Чи є інший спосіб отримати поточний запущений пакет програм?
ps
в оболонці, а політика є, "fg"
а вміст /proc/[pid]/oom_adj_score
дорівнює, 0
тоді додаток є програмою переднього плану. На жаль, /proc/[pid]/oom_adj_score
на Андроїд 6.0 , здається, він більше не читається. gist.github.com/jaredrummler/7d1498485e584c8a120e