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 UsageStatsManager
API 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?
la source
ps
dans un shell et que la stratégie est"fg"
et le contenu de/proc/[pid]/oom_adj_score
égal,0
l'application est l'application de premier plan. Malheureusement, il semble/proc/[pid]/oom_adj_score
ne plus être lisible sur Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120eRéponses:
Pour obtenir une liste des processus en cours d'exécution sur Android 1.6 - Android 6.0, vous pouvez utiliser cette bibliothèque que j'ai écrite: https://github.com/jaredrummler/AndroidProcesses La bibliothèque lit / proc pour obtenir des informations sur le processus.
Google a considérablement limité l'accès à / proc dans Android Nougat. Pour obtenir une liste des processus en cours sur Android Nougat, vous devrez utiliser UsageStatsManager ou disposer d'un accès root.
Cliquez sur l'historique des modifications pour les solutions alternatives précédentes.
la source
Process
implémenterComparable
et remplacez lacompareTo
méthode. Ensuite, lorsque vous utilisezCollections.sort(processesList)
, il utilisera l'ordre que vous avez spécifié.Utilisez cette méthode pour obtenir la tâche de premier plan. Vous aurez besoin d'une autorisation système "android: get_usage_stats"
Si l'utilisateur active cela dans le paramètre -> Sécurité-> application avec accès à l'utilisation. Après cela, vous obtiendrez une tâche au premier plan. Processus similaire Clean matser par Cheetahamobile lien Google Play
la source
UsageStatsManager
. Samsung a supprimé les demandes et il est assez ennuyeux pour un utilisateur d'accorder une autorisation système.Jetez un œil à https://github.com/ricvalerio/foregroundappchecker , c'est peut-être ce dont vous avez besoin. Fournit un exemple de code et évite d'avoir à implémenter un détecteur de premier plan de versions croisées.
Voici deux exemples:
Ou vérifiez régulièrement:
la source
Google a limité cette fonctionnalité aux applications système uniquement. Comme signalé dans un ticket de bogue , vous aurez besoin de l' autorisation REAL_GET_TASKS pour y accéder.
la source
Il suffit de lancer une optimisation potentielle de ce que j'imagine est un morceau de code fortement copié pour détecter l'application la plus performante sur Android M.
Ce
Peut être simplifié à ceci
Je me suis retrouvé à utiliser ce code dans une boucle de 2 secondes et je me suis demandé pourquoi j'utilisais une solution complexe qui était O (n * log (n)) alors qu'une solution plus simple était disponible dans Collections.max () qui est O (n ).
la source
Ensuite, démarrez le service et l'accessibilité de l'application dans les paramètres de votre appareil-> accessibilité-> Application sur ce service.
la source
Veuillez essayer d'utiliser à la
getRunningServices()
place de lagetRunningAppProcesses()
méthode.la source