Comment détecter si l'une de mes activités est à l'avant-plus et visible pour l'utilisateur?
Je voudrais lancer une intention lorsqu'un de mon activité est visible, sinon je vais le mettre comme une notification, et sera déclenché par l'utilisateur.
Pour décider de cela, j'ai besoin de savoir si mon activité est à l'avant-plus, comment puis-je le faire?
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas qu'il y a une méthode pour obtenir le actuellement à l'affiche l'activité, mais vous pourriez faire quelque chose combinant les L'Activité Du Cycle De Vie et un drapeau.
Pour le drapeau, si vous avez prolongé la classe d'Application, qui est probablement un endroit décent pour les stocker. Pour l'extension de la classe d'application, l' haut de réponse à cette question a des infos. (d).
Donc probablement à garder une trace de l'activité (ou un drapeau que l'activité est visible) dans onResume/onPause ou onStart/onStop selon exactement ce comportement que vous souhaitez.
Puisque vous avez plusieurs activités, vous aurez besoin d'un centroïde de la place pour ranger le drapeau, c'est pourquoi l'Application du sens. Vous pouvez obtenir l'Application personnalisée objet en jetant le contexte de l'application (par exemple, ((MyApplication)getcontexteapplication()).isMyActivityActive).
Vous pouvez prolonger l'Activité pour aider à garder ce code propre et contenue.
Si vous utilisez un service, vous pouvez lier le service dans toutes les activités dans le démarrage/onStop (ou onResume/onPause). S'il est lié, vous êtes visible.
Vous pouvez demander de l'exécution des tâches de ActivityManager:
De l'API docs:
De sorte que le premier élément de la liste est la première activité.
onResume()
appelé &&onPause()
pas appelé = visible.Avoir un
public static Activity currentlyVisible;
dans votreApplication
sous-classe qui sera mise à jour par vos activités (définie à l'instance enonResume()
etnull
ed dansonPause()
). Ou d'inventer un moins moche variante d'un registre.Vous pouvez utiliser onWindowFocusChanged(boolean possèdefocus) placez le tout dans une super-classe de vos activités de lancement, l'intention, si elle a le focus.
Au lieu d'utiliser un gestionnaire d'il y a un truc tout simple que vous pouvez faire à l'aide de code. Si vous observez le cycle d'activité de près, le flux entre les deux activités et de premier plan à l'arrière-plan est comme suit. Supposons que A et B sont deux activités.
Lors de la transition de A à B: 1. onPause() de A est appelé 2. onResume() de B est appelé 3. onStop() de A est appelé lorsque B est entièrement repris
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 d'arrière-plan en mettant simplement un indicateur de l'activité.
Faire un résumé de l'activité et de l'étendre à partir de vos autres activités, de sorte que vous n'avez pas à copier coller le code pour toutes les autres activités où vous avez besoin de fond de l'événement.
Dans le résumé de l'activité créez drapeau isAppInBackground.
Dans onCreate() méthode: isAppInBackground = false;
Dans onPause() méthode: isAppInBackground = false;
Dans onStop() méthode: isAppInBackground = true;
Vous avez juste besoin de vérifier votre onResume() si isAppInBackground est vrai.
n une fois que vous vérifiez votre drapeau puis de nouveau ensemble isAppInBackground = false
Pour la transition entre deux activités depuis onSTop() de la première, sera toujours appelé après la deuxième actvity reprend, 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 et, partant, le drapeau sera vrai lorsque vous ouvrez l'application plus tard.