Wygląda na to, że Google w końcu zamknęło wszystkie drzwi do uzyskania obecnego pakietu aplikacji pierwszego planu.
Po aktualizacji Lollipopa, która zabiła getRunningTasks(int maxNum)i dzięki tej odpowiedzi użyłem tego kodu do pobrania pakietu aplikacji pierwszego planu od Lollipopa:
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;
Wygląda na to, że Android 5.1.1 i nowszy (6.0 Marshmallow) również został zabity getRunningAppProcesses(). Teraz zwraca listę własnych pakietów aplikacji.
UsageStatsManager
Możemy używać nowego UsageStatsManagerAPI zgodnie z opisem tutaj, ale nie działa on dla wszystkich aplikacji. Niektóre aplikacje systemowe zwracają ten sam pakiet
com.google.android.googlequicksearchbox
AccessibilityService (grudzień 2017: zostanie zbanowany do użytku przez Google)
Niektóre aplikacje używają AccessibilityService(jak widać tutaj ), ale ma pewne wady.
Czy istnieje inny sposób uzyskania aktualnie uruchomionego pakietu aplikacji?
psw powłoce i zasada jest, "fg"a zawartość /proc/[pid]/oom_adj_scorejest równa, 0to aplikacja jest aplikacją pierwszego planu. Niestety wydaje się, że /proc/[pid]/oom_adj_scorenie można go już odczytać w systemie Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e