Il semble que Google ait finalement fermé toutes les portes pour obtenir le package d'application actuel au premier plan.
Après la mise à jour de Lollipop, qui a tué getRunningTasks(int maxNum)et grâce à cette réponse , j'ai utilisé ce code pour obtenir le package d'application au premier plan depuis 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;
Android 5.1.1 et supérieur (6.0 Marshmallow), semble-t-il, également tué getRunningAppProcesses(). Il renvoie maintenant une liste de votre propre package d'application.
UsageStatsManager
Nous pouvons utiliser la nouvelle UsageStatsManagerAPI comme décrit ici mais cela ne fonctionne pas pour toutes les applications. Certaines applications système renverront le même package
com.google.android.googlequicksearchbox
AccessibilityService (décembre 2017: Google va être interdit d'utilisation par Google)
Certaines applications l'utilisent AccessibilityService(comme vu ici ) mais cela présente quelques inconvénients.
Existe-t-il un autre moyen d'obtenir le package d'application en cours d'exécution?
psdans un shell et que la stratégie est "fg"et le contenu de /proc/[pid]/oom_adj_scoreégal, 0l'application est l'application de premier plan. Malheureusement, il semble /proc/[pid]/oom_adj_scorene plus être lisible sur Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e