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?
quelle
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/7d1498485e584c8a120eAntworten:
Um eine Liste der laufenden Prozesse unter Android 1.6 - Android 6.0 zu erhalten, können Sie diese Bibliothek verwenden, die ich geschrieben habe: https://github.com/jaredrummler/AndroidProcesses Die Bibliothek liest / proc, um Prozessinformationen abzurufen.
Google hat den Zugriff auf / proc in Android Nougat erheblich eingeschränkt. Um eine Liste der laufenden Prozesse auf Android Nougat zu erhalten, müssen Sie UsageStatsManager verwenden oder über Root-Zugriff verfügen.
Klicken Sie auf den Bearbeitungsverlauf für frühere alternative Lösungen.
quelle
Process
implementierenComparable
und überschreibencompareTo
. Wenn Sie dann verwendenCollections.sort(processesList)
, wird die von Ihnen angegebene Reihenfolge verwendet.Verwenden Sie diese Methode, um die Vordergrundaufgabe abzurufen. Sie benötigen eine Systemberechtigung "android: get_usage_stats"
WENN Benutzer dies in Einstellung -> Sicherheit-> App mit Nutzungszugriff aktivieren. Danach erhalten Sie eine Vordergrundaufgabe. Ähnliches Verfahren Clean Matser von Cheetahamobile Google Play Link
quelle
UsageStatsManager
. Samsung hat Anfragen entfernt und es ist ziemlich ärgerlich für einen Benutzer, eine Systemberechtigung zu erteilen.Werfen Sie einen Blick auf https://github.com/ricvalerio/foregroundappchecker , es könnte das sein, was Sie brauchen. Bietet Beispielcode und erspart Ihnen die Implementierung eines versionübergreifenden Vordergrunddetektors.
Hier sind zwei Beispiele:
Oder überprüfen Sie regelmäßig:
quelle
Google hat diese Funktionalität nur für System-Apps eingeschränkt. Wie in einem Bug-Ticket gemeldet , benötigen Sie die Berechtigung REAL_GET_TASKS , um dort darauf zugreifen zu können.
quelle
Nur eine mögliche Optimierung für das, was ich mir vorstelle, ist ein stark kopierter Code zum Erkennen der am häufigsten verwendeten Anwendung auf Android M.
Dies
Kann dazu vereinfacht werden
Ich stellte fest, dass ich diesen Code in einer 2-Sekunden-Schleife verwendete, und fragte mich, warum ich eine komplexe Lösung verwendete, die O (n * log (n)) war, als in Collections.max () eine einfachere Lösung verfügbar war, die O (n) ist ).
quelle
Starten Sie dann den Dienst und die App-Zugänglichkeit in Ihrer Geräteeinstellung-> Eingabehilfen-> App für diesen Dienst.
quelle
Bitte versuchen Sie es
getRunningServices()
anstelle dergetRunningAppProcesses()
Methode.quelle