web-dev-qa-db-fra.com

Comment détecter si l'une de mes activités est visible et visible pour l'utilisateur?

Je souhaite lancer une intention lorsque l’une de mes activités est visible, sinon je l’afficherai comme une notification et l’utilisateur le renverra. 

Pour décider de cela, j'ai besoin de savoir si l'une de mes activités est la plus en pointe, comment puis-je le faire?

25
Pentium10

Je ne sais pas s'il existe une méthode pour obtenir l'activité actuellement affichée, mais vous pouvez faire quelque chose en combinant le Cycle de vie de l'activité et un indicateur.

Pour le drapeau, si vous avez étendu la classe Application, c'est probablement un endroit décent pour la stocker. Pour étendre la classe d’applications, le la meilleure réponse à cette question a des infos. (ré).

Donc, gardez probablement une trace de l'activité active en cours (ou d'un indicateur indiquant que l'activité est visible) dans onResume/onPause ou onStart/onStop, en fonction du comportement souhaité.

Comme vous avez plusieurs activités, vous aurez besoin d’un emplacement centroïde pour stocker le drapeau. C’est pourquoi l’application est logique. Vous pouvez obtenir l'objet Application personnalisé en définissant le contexte de l'application (par exemple ((MyApplication) getApplicationContext ()). IsMyActivityActive).

Vous pouvez également étendre l'activité pour garder ce code propre et contenu.


Si vous utilisez un service, vous pouvez le lier à chaque activité de onStart/onStop (ou onResume/onPause). Si lié, vous êtes visible.

10
mbafford

Vous pouvez demander les tâches en cours à partir de ActivityManager:

ActivityManager activityManager = (ActivityManager)getContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE));

De la documentation de l'API: 

Retourne une liste des tâches en cours d'exécution, avec le plus de récent étant le premier et les plus vieux après dans l'ordre.

Le premier élément de la liste est donc l'activité la plus en avant.

4
Zds

onResume() appelé && onPause() non appelé = visible.
Avoir un public static Activity currentlyVisible; dans votre sous-classe Application qui sera mis à jour par vos activités (défini sur l'instance dans onResume() et nulled dans onPause()) Ou inventer une variante moins laide d'un registre.

3
yanchenko

Vous pouvez utiliser onWindowFocusChanged (boolean hasFocus) pour le placer dans une super-classe de vos activités afin de lancer l’intention si elle a le focus.

2
Grant

Au lieu d'utiliser Activity Manager, il existe une astuce simple que vous pouvez utiliser avec du code. Si vous observez le cycle des activités de près, le flux entre deux activités et l’avant-plan sur l’arrière-plan est le suivant. Supposons que A et B sont deux activités.

Lors du passage de A à B: 1. onPause () de A est appelé 2. onResume () de B est appelé 3. onStop () de A est appelé lorsque B reprend complètement

Lorsque l'application passe en arrière-plan: 1. onPause () de A est appelé 2. onStop () de A est appelé

Vous pouvez détecter votre événement en arrière-plan en mettant simplement un indicateur en activité.

Créez une activité abstraite et étendez-la à partir de vos autres activités, de sorte que vous n'ayez pas à copier-coller le code de toutes les autres activités lorsque vous avez besoin d'un événement en arrière-plan.

Dans l'activité abstraite, créez un indicateur isAppInBackground.

Dans la méthode onCreate (): isAppInBackground = false;

Dans la méthode onPause (): isAppInBackground = false;

Dans la méthode onStop (): isAppInBackground = true;

Il vous suffit de vérifier dans onResume () si isAppInBackground est vrai . N après avoir vérifié votre indicateur, puis définissez à nouveau isAppInBackground = false

Pour la transition entre deux activités, puisque onSTop () du premier sera toujours appelé après la reprise de la deuxième activité, le drapeau ne sera jamais vrai et lorsque l'application est en arrière-plan, onStop () de l'activité sera appelée immédiatement après onPause. Par conséquent, le drapeau sera vrai quand vous ouvrez l'application plus tard.

0
Ankita