2015-12-10 12 views
18

Ich versuche, die derzeit sichtbare Anwendung für den Benutzer zu ermitteln. Um dies zu tun, verwende ich die activityManager.getRunningAppProcesses() Methode.Get (real) Vordergrund-Prozess mit activityManager.getRunningAppProcesses()

Ich weiß, dass die Methode nicht unter Android 5.1.1 unterstützt wird - das ist in Ordnung.

Am Anfang funktionierte es wie Charme, ich bin durch die Liste von RunningAppProcessInfos iterieren und auf die Wichtigkeit prüfen.

tl; dr Was ist die richtige Methode, um aktuellen Vordergrundprozess zu erhalten und falsche Postives zu verhindern? Wie ist die Reihenfolge der Liste - die API sagt, es ist nicht angegeben. Gibt es eine Möglichkeit, sie richtig zu bestellen?

Was ich getan habe:

Leider ist die Liste der Activitymanager zurück auf jedem Gerät unterscheidet. Einige Geräte geben mehrere Infos mit der Wichtigkeit 100 (FOREGROUND) zurück, auch wenn der Prozess derzeit nicht sichtbar ist.

Dies verursachte das Problem, dass ich viele falsche Positive hatte. Zum Beispiel habe ich es mit Facebook getestet und einen Toast erstellt, jedes Mal, wenn Facebook im Vordergrund ist. Ich wechselte zu Home, also sollte mein Launcher den Vordergrundprozess haben. Es war für 10 Sekunden, danach, facebook erschien mit der Bedeutung FOREGROUND in der Liste wieder (es war nicht offen und nicht sichtbar) und ich bekam eine falsch positive.

Ich erkannte, dass einige Geräte die Liste durch den letzten Prozess an der Spitze ordnen. Also beschloss ich, die folgende Vorgehensweise, um zu versuchen:

ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0); 
     final String processName = appProcess.processName; 
     final String packageName = removeProcessSuffix(processName); 
     if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){ 
      //do something, like the toast 
     } 

Mit appProcesses.get (0); Ich untersuche nur das erste Element und der Fehler ist weg. Keine falschen positiven Ergebnisse mehr.

Aber, jetzt auf einigen Geräten wir nicht bekommen, den Vordergrundprozess überhaupt nicht mehr. Weil sie die Liste in keiner Weise ordnen. Zum Beispiel einige 4,2 Sony Smartphones sind einige der Kandidaten. Ich bekomme die Liste, aber der wirklich aktuell sichtbare Prozess ist bei Index 11 oder so.

Ich habe keine Ahnung, was zu tun ist, um den aktuellen Vordergrundprozess zu erhalten, ohne falsche Positive.

Was ist die richtige Methode, um aktuellen Vordergrundprozess zu erhalten und falsche Postives zu verhindern? Wie ist die Reihenfolge der Liste - die API sagt, es ist nicht angegeben. Gibt es eine Möglichkeit, sie richtig zu bestellen?

Vielen Dank!

+0

Das sieht aus wie ein Betrüger von http://stackoverflow.com/questions/2166961/determining-the-current-foreground-application-from-a-background-task-or-service – alzee

+0

Ich habe nicht getestet, aber das sieht so aus als würde es dir helfen: http://stackoverflow.com/a/33886313/4973904 –

+0

@ ÁlissonMorais Nun, danke zuerst für die Antwort, aber hast du die komplette Frage gelesen? Ich kann das erste Element der zurückgegebenen Liste nicht verwenden, da die Liste bei etwa 30% der Geräte nicht sortiert ist. – JacksOnF1re

Antwort

3

Was ist die richtige Methode aktuellen Vordergrundprozess zu erhalten und verhindern Fehlalarme?

UsageStatsManager ist die einzige offizielle API, um die laufende app (see #50) zu erhalten.

Verwenden getRunningTasks(int maxNum), getRunningAppProcesses() oder AccessibilityService, um die Vordergrund-App zu bekommen war nie zuverlässig. Die Dokumentation für die ersten beiden Methoden hat die folgende Warnung: Note: this method is only intended for debugging


Unten ist ein Beispiel für das Erhalten der Top-App UsageStatsManager:

Calendar endCal = Calendar.getInstance(); 
Calendar beginCal = Calendar.getInstance(); 
beginCal.add(Calendar.MINUTE, -30); 
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); 
List<UsageStats> stats = manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 
    beginCal.getTimeInMillis(), endCal.getTimeInMillis()); 
Collections.sort(stats, new Comparator<UsageStats>() { 

    @Override public int compare(UsageStats lhs, UsageStats rhs) { 
    long time1 = lhs.getLastTimeUsed(); 
    long time2 = rhs.getLastTimeUsed(); 
    if (time1 > time2) { 
     return -1; 
    } else if (time1 < time2) { 
     return 1; 
    } 
    return 0; 
    } 
}); 
// The first "UsageStats" in the list will be the top application. 
// If the list is empty you will need to ask for permissions to use UsageStatsManager 
// To request permission: 
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)); 

Ich weiß, das nicht der Fall ist die Antwort, auf die Sie hoffen. Apps wie CM Security und AppLock verwenden UsageStatsManager auf Android 5.1.1+. Aufgrund von SeLinux ist es unmöglich, die Vordergrund-App mit getRunningTasks(int maxNum) oder getRunningAppProcesses() zu erhalten.

+0

Danke für die Antwort! Leider funktioniert der StatsManager nicht für die meisten Samsumg-Geräte und nicht unterhalb von API 21 (wie Sie auch sagten). : / – JacksOnF1re