Es scheint, dass Google endlich alle Türen geschlossen hat, um das aktuelle Vordergrundanwendungspaket zu erhalten.
Nach dem Lollipop-Update, das getötet wurde, getRunningTasks(int maxNum)
und dank dieser Antwort habe ich diesen Code verwendet, um das Vordergrundanwendungspaket seit Lollipop zu erhalten:
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 und höher (6.0 Marshmallow) scheint ebenfalls getötet worden getRunningAppProcesses()
zu sein. Es wird nun eine Liste Ihres eigenen Anwendungspakets zurückgegeben.
UsageStatsManager
Wir können die neue UsageStatsManager
API wie hier beschrieben verwenden , sie funktioniert jedoch nicht für alle Anwendungen. Einige Systemanwendungen geben dasselbe Paket zurück
com.google.android.googlequicksearchbox
AccessibilityService (Dezember 2017: Wird für die Verwendung durch Google gesperrt)
Einige Anwendungen verwenden AccessibilityService
(wie hier zu sehen ), haben jedoch einige Nachteile.
Gibt es eine andere Möglichkeit, das aktuell ausgeführte Anwendungspaket abzurufen?
ps
in einer Shell analysiere und die Richtlinie "fg"
und der Inhalt von /proc/[pid]/oom_adj_score
gleich sind, 0
ist die App die Vordergrundanwendung. Leider scheint /proc/[pid]/oom_adj_score
es unter Android 6.0 nicht mehr lesbar zu sein. gist.github.com/jaredrummler/7d1498485e584c8a120e