59 votes

Comment faire pour déterminer si l'une de mes activités est au premier plan

J'ai mis en place un BroadcastReceiver qui est déclenché par la AlarmManager. Le AlarmManager est initialisé sur BOOT_COMPLETED. Donc, je dois déclarer le récepteur dans le manifeste.

Mon problème est que je veux le BroadcastReceiver seulement faire quelque chose quand aucun de mes propres activités sont au premier plan (aka l'utilisateur n'est pas en interaction avec mon application). - Je extraire des informations à partir d'un serveur distant et ne veulent pas d'avertir l'utilisateur si il est actuellement dans mon application, de toute façon.

Jusqu'à présent, je n'ai pas réussi à trouver un moyen pour déterminer si mon application est au premier plan. Est-il possible de faire une telle chose? Le ActivityManager dit moi si ma demande est en cours d'exécution, mais pas si elle est au premier plan.

Le problème est à peu près la même que celle décrite ici: Informer de l'Activité à partir d'un BroadcastReceiver que si elle est au premier plan

SOLUTION:

Après avoir évalué plusieurs solutions, je veux rapidement décrire ce que je pense est la meilleure méthode pour traiter les activités en arrière-plan/premier plan.

Le meilleur moyen est de vous inscrire à un récepteur de radiodiffusion dans la méthode onResume de votre activité et de la supprimer de la liste sur l'activité des onPause. Tout service ou tout autre élément de décor que de besoin pour envoyer une diffusion intention avec une action spécifique de votre activité d'interception.

Si votre activité est en premier plan, il aura son intention récepteur enregistré et est en mesure de traiter directement avec l'intention d'envoyer à partir de votre service. Si elle n'est pas au premier plan, il ne recevra pas l'intention, mais le service que invokved la diffusion se fera à savoir que personne ne intercepté sa diffusion intention et sera en mesure de faire face avec lui-même. Par exemple, il pourrait que le lancement de l'activité souhaitée, afficher une notification etc.

27voto

Idolon Points 11503

La réponse suivante: "de l'application en cours d'exécution en arrière-plan", résume solutions disponibles pour l'arrière-plan/premier plan de vérification.

Note:
Auparavant, cette réponse m'a suggéré d'utiliser ActivityManager.getRunningAppProcesses(), cependant que la méthode semble être totalement fiable, et son utilisation est déconseillée. Consultez le lien ci-dessus pour les détails.

12voto

CommonsWare Points 402670

Votre activité peut suivre son propre état, si elle est au premier plan (ensemble booléen true en onStart(), false en onStop()). Hélas, boolean n'est pas fourni par Activity automatiquement.

4voto

jqpubliq Points 7677

ActivityManager#getRunningAppProcesses() renvoie une Liste d' RunningAppProcessInfo. Chaque RunningAppProcessInfo a un champ appelé importance. une importance égale à RunningAppProcessInfo.IMPORTANCE_FOREGROUND semble montrer que l'activité est activement observés par l'utilisateur. Il est également RunningAppProcessInfo.IMPORTANCE_VISIBLE ce qui est inférieur, mais peut-être la peine de vérifier.

3voto

Mannaz Points 6351

découvrez ma solution pour déterminer si une activité est au premier plan: http://www.mannaz.at/codebase/android-activity-foreground-surveillance/

Il devrait être facile de revenir à la logique de "au premier plan" à "en arrière-plan".

3voto

Pastiche Points 21

J'ai mis en place un BroadcastReceiver qui est déclenché par la AlarmManager. Le AlarmManager est initialisé sur BOOT_COMPLETED. Donc, je dois déclarer le récepteur dans le manifeste.

Mon problème est que je veux le BroadcastReceiver seulement faire quelque chose quand aucun de mes propres activités sont au premier plan (aka l'utilisateur n'est pas en interaction avec mon application). - Je extraire des informations à partir d'un serveur distant et ne veulent pas d'avertir l'utilisateur si il est actuellement dans mon application, de toute façon.

Jusqu'à présent, je n'ai pas réussi à trouver un moyen pour déterminer si mon application est au premier plan. Est-il possible de faire une telle chose? Le ActivityManager dit moi si ma demande est en cours d'exécution, mais pas si elle est au premier plan.

Il ne semble pas être un moyen direct pour déterminer si l'une de vos activités est en cours d'exécution au premier plan de l'activité. Cependant, vous pouvez obtenir l'effet désiré en utilisant un ordre de diffusion et de deux récepteurs de radiodiffusion. Un récepteur de radiodiffusion doit être enregistrée dans OnResume() et non dans OnPause(). Le 2ème récepteur de radiodiffusion sera déclaré dans votre manifeste, comme vous l'avez déjà fait. Jeu android:priorité à vos destinataires de telle sorte que si les inscrits de manière dynamique récepteur est enregistré, il recevra l'intention d'abord, puis vous pouvez manger à l'intention de sorte que le récepteur de radiodiffusion que vous avez enregistré dans votre manifeste, n'est jamais avisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X