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 UsageStatsManager
API 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?
ps
w powłoce i zasada jest, "fg"
a zawartość /proc/[pid]/oom_adj_score
jest równa, 0
to aplikacja jest aplikacją pierwszego planu. Niestety wydaje się, że /proc/[pid]/oom_adj_score
nie można go już odczytać w systemie Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e