Existe-t-il un moyen simple de déterminer si une certaine activité est active ou non? Je veux faire certaines choses en fonction de l'activité active. par exemple:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
user560571
la source
la source
Réponses:
Vous pouvez utiliser une
static
variable dans l'activité.Le seul problème est que si vous l'utilisez dans deux activités qui se lient l'une à l'autre
onStop
, la première est parfois appelée après laonStart
seconde. Les deux pourraient donc être vrais brièvement.En fonction de ce que vous essayez de faire (mettre à jour l'activité actuelle d'un service?). Vous pouvez simplement enregistrer un écouteur statique dans le service dans votre
onStart
méthode d' activité , puis l'écouteur approprié sera disponible lorsque votre service souhaite mettre à jour l'interface utilisateur.la source
MyActivity
avecMyChildactivity
et que vous souhaitez vérifier si l'enfant est actif?Je me rends compte que ce problème est assez ancien, mais je pense qu'il vaut toujours la peine de partager ma solution car elle pourrait être utile à d'autres.
Cette solution n'était pas disponible avant la sortie des composants d'architecture Android.
L'activité est au moins partiellement visible
L'activité est au premier plan
la source
Je pense plus clair comme ça:
la source
Une option sans utiliser de variable auxiliaire est:
où l'activité est fe: this ou getActivity ().
La valeur renvoyée par cette expression change dans onStart () / onStop (), qui sont les événements qui démarrent / arrêtent montrant la disposition de l'activité sur le téléphone.
la source
Activity#getWindow().getDecorView().isShown()
?J'ai utilisé MyActivity.class et la méthode getCanonicalName et j'ai obtenu une réponse.
la source
getRunningTasks()
car il était obsolète: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/…Bien mieux que d'utiliser une variable statique et de suivre la POO
Shared Preferences
peut être utilisé pour partager des variables avec d'autresactivities
et des services d'unapplication
Utilisez les préférences partagées. Il a les informations d'état les plus fiables, moins de problèmes de changement / destruction d'application, nous évite de demander une autre autorisation et nous donne plus de contrôle pour décider quand notre activité est réellement la plus élevée. voir les détails ici abd ici aussi
la source
onStop()
Il s'agit d'un code permettant de vérifier si un service particulier est en cours d'exécution. Je suis assez sûr que cela peut fonctionner pour une activité aussi longtemps que vous changez getRunningServices avec getRunningAppProcesses () ou getRunningTasks (). Jetez un oeil ici http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Modifiez Constants.PACKAGE et Constants.BACKGROUND_SERVICE_CLASS en conséquence
la source
Il existe un moyen beaucoup plus simple que tout ce qui précède et cette approche ne nécessite pas l'utilisation de
android.permission.GET_TASKS
dans le manifeste, ni le problème des conditions de concurrence ou des fuites de mémoire souligné dans la réponse acceptée.Créez une variable STATIC dans l'activité principale. Statique permet à d'autres activités de recevoir les données d'une autre activité.
onPause()
définir cette variable fausse ,onResume
etonCreate()
définir cette variable vrai .Attribuez des getters et des setters à cette variable.
Et puis à partir d'une autre activité ou service
la source
À partir des documents officiels:
Activité # isFinishing ()
Activité # isDestroyed ()
la source
merci kkudi! J'ai pu adapter votre réponse pour travailler pour une activité ... voici ce qui a fonctionné dans mon application.
cet exemple vous donnera un vrai ou un faux si topActivity correspond à ce que fait l'utilisateur. Donc, si l'activité que vous recherchez n'est pas affichée (c'est-à-dire en pause), vous n'obtiendrez pas de correspondance. Pour ce faire, vous devez également ajouter l'autorisation à votre manifeste.
J'espère que cela a été utile!
la source
Je pense que la réponse acceptée est une manière terrible de gérer cela.
Je ne sais pas quel est le cas d'utilisation, mais veuillez considérer une méthode protégée dans la classe de base
et remplacez-le dans la classe dérivée.
Lorsque l'événement se produit, appelez simplement cette méthode dans la classe de base. La classe «active» correcte la gérera alors. La classe elle-même peut alors vérifier si ce n'est pas le cas
Paused()
.Mieux encore, utilisez un bus d'événements comme celui de GreenRobot , Square , mais celui-ci est obsolète et suggère d'utiliser RxJava
la source
J'ai utilisé un chèque
if (!a.isFinishing())
et il semble faire ce dont j'ai besoin.a
est l'instance d'activité. Est-ce incorrect? Pourquoi personne n'a essayé ça?la source
qu'en est-il de
activity.isFinishing()
la source
ActivityLifecycleCallbacks est un excellent moyen de suivre toutes les activités de l'application:
ActivityState:
Étendez la classe Application et fournissez sa référence dans le fichier Manifest Android:
Vérifiez n'importe où à partir de l'activité pour le statut d'une autre activité:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
la source
Je ne suis pas sûr que ce soit une «bonne» façon de «faire les choses».
S'il n'y a aucun moyen de l' API pour résoudre le (ou a) question que vous devriez réfléchir un peu, peut - être que vous faites quelque chose de mal et lire plus de docs à la place , etc.
(Comme je l' ai compris les variables statiques est une façon généralement mal dans Android. De la cause cela pourrait fonctionner, mais il y aura certainement des cas où cela ne fonctionnera pas [par exemple, en production, sur des millions d'appareils]).
Exactement dans votre cas, je suggère de réfléchir pourquoi avez-vous besoin de savoir si une autre activité est vivante? .. vous pouvez démarrer une autre activité pour que le résultat obtienne sa fonctionnalité. Ou vous pouvez dériver la classe pour obtenir ses fonctionnalités et ainsi de suite.
Meilleures salutations.
la source
Si vous êtes intéressé par l'état du cycle de vie de l'instance spécifique de l'activité, la solution de siliconeagle semble correcte, sauf que la nouvelle variable "active" doit être une variable d'instance plutôt que statique.
la source
Utilisez une diffusion commandée. Voir http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html
Dans votre activité, enregistrez un récepteur dans onStart, désinscrivez-vous dans onStop. Maintenant, lorsque, par exemple, un service doit gérer quelque chose que l'activité pourrait mieux faire, envoyez une diffusion ordonnée à partir du service (avec un gestionnaire par défaut dans le service lui-même). Vous pouvez maintenant répondre à l'activité lorsqu'elle est en cours d'exécution. Le service peut vérifier les données de résultat pour voir si la diffusion a été gérée et, dans le cas contraire, prendre les mesures appropriées.
la source
En plus de la réponse acceptée , si vous avez plusieurs instances de l'activité, vous pouvez utiliser un compteur à la place:
la source
As-tu essayé..
la source
Trouvé une solution de contournement facile avec le code suivant
la source
Utilisez la variable isActivity pour vérifier si l'activité est active ou non.
Puis vérifier
la source
Si vous voulez vérifier si l'activité est dans la pile arrière, suivez simplement les étapes suivantes. 1. Déclaré un ArrayList dans votre classe Application [La classe Application est définie dans votre fichier mainfest dans la balise application]
Et ajoutez les méthodes publiques suivantes pour accéder et modifier cette liste.
Dans votre BaseActivity, où toutes les activités l'étendent, remplacez les méthodes onCreate et onDestroy afin que vous puissiez ajouter et supprimer des activités de la pile arrière comme suit.
Enfin, si vous souhaitez vérifier si l'activité est dans la pile arrière ou non, appelez simplement cette fonction isActivityInBackStack.
Ex: je veux vérifier si le HomeActivity est dans la pile arrière ou non:
la source
la source
Cela fonctionne si vous n'avez pas la même activité au premier plan. Si vous ouvrez à partir de la notification ne fonctionne pas, j'ai fait quelques ajustements et je suis venu avec ceci:
Cela fonctionne pour moi avec plusieurs activités ouvertes en même temps.
la source