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?
źródło
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/7d1498485e584c8a120eOdpowiedzi:
Aby uzyskać listę uruchomionych procesów na Androidzie 1.6 - Android 6.0 możesz skorzystać z tej biblioteki, którą napisałem: https://github.com/jaredrummler/AndroidProcesses Biblioteka czyta / proc, aby uzyskać informacje o procesie.
Google znacznie ograniczył dostęp do / proc w Androidzie Nougat. Aby uzyskać listę uruchomionych procesów na Androidzie Nougat, musisz użyć UsageStatsManager lub mieć uprawnienia administratora.
Kliknij historię edycji, aby zobaczyć poprzednie alternatywne rozwiązania.
źródło
Process
implementacjęComparable
i zastąpcompareTo
metodę. Następnie, gdy użyjeszCollections.sort(processesList)
, użyje określonej przez Ciebie kolejności.Użyj tej metody, aby uzyskać zadanie pierwszego planu. Będziesz potrzebować uprawnień systemowych „android: get_usage_stats”
JEŚLI użytkownik włączy to w ustawieniach -> Bezpieczeństwo-> aplikacja z dostępem do użytkowania. Po tym otrzymasz zadanie pierwszego planu. Podobny proces Wyczyść matser przez Cheetahamobile link do Google Play
źródło
UsageStatsManager
. Samsung usunął żądania, a przyznanie uprawnień systemowych jest dość denerwujące.Spójrz na https://github.com/ricvalerio/foregroundappchecker , może to być to, czego potrzebujesz. Dostarcza przykładowy kod i eliminuje ból związany z koniecznością implementacji wykrywacza pierwszego planu między wersjami.
Oto dwie próbki:
Lub regularnie sprawdzaj:
źródło
Firma Google ograniczyła tę funkcjonalność tylko do aplikacji systemowych. Jak informowaliśmy w zgłoszeniu błędu , będziesz potrzebować uprawnienia REAL_GET_TASKS, aby uzyskać do niego dostęp.
źródło
Po prostu rzucam potencjalną optymalizację tego, co sobie wyobrażam, to mocno skopiowany fragment kodu do wykrywania najpopularniejszej aplikacji na Androida M.
To
Można to uprościć
Odkryłem, że używam tego kodu w 2-sekundowej pętli i zastanawiałem się, dlaczego używam złożonego rozwiązania, które było O (n * log (n)), skoro prostsze rozwiązanie było dostępne w Collections.max (), czyli O (n ).
źródło
Następnie uruchom usługę i dostępność aplikacji w ustawieniach swojego urządzenia-> dostępność-> Aplikacja w tej usłudze.
źródło
Spróbuj użyć
getRunningServices()
zamiastgetRunningAppProcesses()
metody.źródło