Sembra che Google abbia finalmente chiuso tutte le porte per ottenere l'attuale pacchetto di applicazioni in primo piano.
Dopo l'aggiornamento di Lollipop, che ha ucciso getRunningTasks(int maxNum)
e grazie a questa risposta , ho usato questo codice per ottenere il pacchetto dell'applicazione in primo piano da Lollipop:
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;
Sembra getRunningAppProcesses()
che anche Android 5.1.1 e versioni successive (6.0 Marshmallow) siano stati uccisi . Ora restituisce un elenco del pacchetto dell'applicazione.
UsageStatsManager
Possiamo usare la nuova UsageStatsManager
API come descritto qui ma non funziona per tutte le applicazioni. Alcune applicazioni di sistema restituiranno lo stesso pacchetto
com.google.android.googlequicksearchbox
AccessibilityService (dicembre 2017: verrà vietato l'uso da parte di Google)
Alcune applicazioni usano AccessibilityService
(come visto qui ) ma presenta alcuni svantaggi.
C'è un altro modo per ottenere il pacchetto dell'applicazione corrente in esecuzione?
ps
in una shell e la politica è "fg"
e il contenuto di è /proc/[pid]/oom_adj_score
uguale, 0
l'app è l'applicazione in primo piano. Sfortunatamente, sembra /proc/[pid]/oom_adj_score
non sia più leggibile su Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e