J'ai un écran de démarrage sur une minuterie. Mon problème est qu'avant finish()
mon activité, je dois vérifier que l'activité suivante a commencé car une boîte de dialogue système apparaît et je veux seulement finish()
; une fois que l'utilisateur a sélectionné une option dans la boîte de dialogue?
Je sais qu'il y a beaucoup de questions sur la façon de voir si votre activité est au premier plan mais je ne sais pas si cela permet aussi des boîtes de dialogue en plus de l'activité.
Voici le problème, le rouge est mon activité qui est en arrière-plan tandis que le dialogue est au premier plan:
EDIT: J'ai essayé de ne pas utiliser, finish()
mais mon activité peut être retournée dans la pile d'applications que j'essaie d'éviter.
Réponses:
Voici ce qui est recommandé comme la bonne solution:
Dans votre
finish()
méthode, vous souhaitez utiliserisActivityVisible()
pour vérifier si l'activité est visible ou non. Là, vous pouvez également vérifier si l'utilisateur a sélectionné une option ou non. Continuez lorsque les deux conditions sont remplies.La source mentionne également deux mauvaises solutions ... alors évitez de faire cela.
Source: stackoverflow
la source
onPause
,onStop
ni l'onResume
événement est appelé. Alors, que faites-vous si aucun de ces événements n'est déclenché?!Si vous ciblez le niveau d'API 14 ou supérieur, vous pouvez utiliser android.app.Application.ActivityLifecycleCallbacks
la source
UPD : mis à jour à l'état
Lifecycle.State.RESUMED
. Merci à @htafoya pour cela.En 2019, avec l'aide de la nouvelle bibliothèque de support
28+
ou d'AndroidX, vous pouvez simplement utiliser:Vous pouvez en lire plus dans la documentation pour comprendre ce qui s'est passé sous le capot.
la source
activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)
ou COMMENCER.INITIALIZED
ne garantit pas qu'il est au premier plan.Activity :: hasWindowFocus () vous renvoie le booléen dont vous avez besoin.
Voici un exemple de classe pour vérifier la visibilité de vos activités où que vous soyez.
N'oubliez pas que si vous affichez une boîte de dialogue , le résultat sera faux car la boîte de dialogue aura le focus principal. À part cela, c'est vraiment pratique et plus fiable que les solutions suggérées.
la source
C'est exactement la différence entre
onPause
et lesonStop
événements de l'activité, comme décrit dans la documentation de la classe d'activité .Si je vous comprends bien, ce que vous voulez faire est d'appeler
finish()
depuis votre activitéonStop
pour y mettre fin. Voir l'image ci-jointe de l' application de démonstration Activity Lifecycle . Voici à quoi cela ressemble lorsque l'activité B est lancée à partir de l'activité A. L'ordre des événements est de bas en haut afin que vous puissiez voir que l'activité AonStop
est appelée après que l'activité BonResume
a déjà été appelée.Si une boîte de dialogue s'affiche, votre activité est grisée en arrière-plan et
onPause
est uniquement appelée.la source
Deux solutions possibles:
1) Rappels d'activité LifeCycle
Utilisez une application qui implémente ActivityLifecycleCallbacks et utilisez-la pour suivre les événements du cycle de vie des activités dans votre application. Notez que ActivityLifecycleCallbacks sont pour l'API Android> = 14. Pour les API Android précédentes, vous devrez l'implémenter vous-même dans toutes vos activités ;-)
Utilisez Application lorsque vous avez besoin de partager / stocker des états dans des activités.
2) Vérifiez les informations du processus en cours d'exécution
Vous pouvez vérifier l'état d'un processus en cours avec cette classe RunningAppProcessInfo
Récupérez la liste des processus en cours avec ActivityManager.getRunningAppProcesses () et filtrez la liste de résultats pour vérifier le RunningAppProcessInfo souhaité et vérifier son "importance"
la source
J'ai créé un projet sur github app-foreground-background-listen
qui utilise une logique très simple et fonctionne bien avec tous les niveaux d'API Android.
la source
Utilisez l'intervalle de temps entre la pause et la reprise depuis l'arrière-plan pour déterminer s'il est réveillé depuis l'arrière-plan
Dans une application personnalisée
Dans la classe BaseActivity
la source
Je pense que j'ai une meilleure solution. Parce que vous pouvez créer simplement MyApplication.activityResumed (); à chaque activité par une extension.
Tout d'abord, vous devez créer (comme CyberneticTwerkGuruOrc)
Ensuite, vous devez ajouter la classe Application à AndroidManifest.xml
Ensuite, créez la classe ActivityBase
Enfin, lorsque vous créez une nouvelle activité, vous pouvez simplement l'étendre par ActivityBase au lieu d'Activité.
Pour moi, c'est une meilleure méthode car vous devez simplement vous souvenir de extend by ActivityBase. De plus, vous pouvez étendre votre fonction de base à l'avenir. Dans mon cas, j'ai ajouté des récepteurs pour mon service et des alertes sur le réseau dans une classe.
Si vous souhaitez vérifier la visibilité de votre application, vous pouvez simplement appeler
la source
Cela peut atteindre cet objectif de manière efficace en utilisant Application.ActivityLifecycleCallbacks
Par exemple, prenons le nom de la classe Activity comme ProfileActivity, permet de savoir s'il est au premier plan ou en arrière-plan
nous devons d'abord créer notre classe d'application en étendant la classe d'application
qui met en œuvre
Soyons ma classe d'application comme suit
Classe d'application
dans la classe ci-dessus, il y a un méthord de substitution onActivityResumed de ActivityLifecycleCallbacks
où toutes les instances d'activité actuellement affichées à l'écran peuvent être trouvées, vérifiez simplement si votre activité est à l'écran ou non par la méthode ci-dessus.
Enregistrez votre classe Application dans manifest.xml
Pour vérifier la météo, l'activité est au premier plan ou en arrière-plan selon la solution ci-dessus, appelez la méthode suivante sur les endroits que vous devez vérifier
la source
Si vous voulez savoir si une activité de votre application est visible à l'écran, vous pouvez faire quelque chose comme ceci:
Créez simplement un singleton de cette classe et définissez-le dans votre instance d'application comme ci-dessous:
Ensuite, vous pouvez utiliser la méthode isAnyActivityVisible () de votre instance MyAppActivityCallbacks partout!
la source
avez-vous essayé de ne pas appeler finish et de mettre "android: noHistory =" true "dans le manifeste? cela empêchera l'activité d'aller dans la pile.
la source
Je dois dire que votre flux de travail n'est pas d'une manière Android standard. Sous Android, vous n'avez pas besoin de
finish()
votre activité si vous souhaitez ouvrir une autre activité depuis Intent. En ce qui concerne la commodité de l'utilisateur, Android permet à l'utilisateur d'utiliser la touche `` retour '' pour revenir de l'activité que vous avez ouverte à votre application.Alors laissez simplement le système arrêter votre activité et enregistrez tout ce dont vous avez besoin lorsque votre activité est rappelée.
la source
Enregistrez un indicateur si vous êtes en pause ou repris. Si vous êtes repris, cela signifie que vous êtes au premier plan
la source
Une solution possible pourrait être de définir un indicateur lors de l'affichage de la boîte de dialogue système, puis dans la méthode onStop du cycle de vie de l'activité, vérifiez l'indicateur, si vrai, terminez l'activité.
Par exemple, si la boîte de dialogue système est déclenchée par un clic sur un bouton, l'écouteur onclick peut ressembler à
et en arrêt d'activité:
la source
Pourquoi ne pas utiliser les émissions pour cela? la deuxième activité (celle qui doit être active) peut envoyer une diffusion locale comme celle-ci:
puis écrivez un récepteur simple dans l'activité de démarrage:
et enregistrez votre nouveau récepteur auprès du LocalBroadcastManager pour écouter l'émission de votre deuxième activité:
Notez que vous pouvez utiliser une ressource constante ou chaîne pour la chaîne «identificateur de diffusion».
la source
LocalBroadcastManager
iciSi vous utilisez
finish()
simplement pour éviter qu'une nouvelle application ne démarre dans la pile (tâche) de votre application, vous pouvez utiliser l'Intent.FLAG_ACTIVITY_NEW_TASK
indicateur lors du démarrage d'une nouvelle application et ne pas appelerfinish()
du tout. D'après la documentation , c'est le drapeau à utiliser pour implémenter un comportement de style "lanceur".la source
Utilisez ces méthodes dans un fichier
Activity
.isDestroyed()
isFinishing()
Une erreur courante avec
AsyncTask
est de capturer une référence forte à l'hôteActivity
(ouFragment
):C'est un problème car il
AsyncTask
peut facilement survivre au parentActivity
, par exemple si un changement de configuration se produit pendant l'exécution de la tâche.La bonne façon de faire est de faire de votre tâche une
static
classe, qui ne capture pas le parent, et contenant une référence faible à l'hôteActivity
:la source
Voici une solution utilisant la
Application
classe.Vous pouvez simplement l'utiliser comme suit,
Si vous avez une référence à l'activité requise ou que vous utilisez le nom canonique de l'activité, vous pouvez savoir si elle est au premier plan ou non. Cette solution n'est peut-être pas infaillible. Par conséquent, vos commentaires sont vraiment les bienvenus.
la source
Je ne sais pas pourquoi personne n'a parlé de sharedPreferences, pour l'activité A, définir une SharedPreference comme celle-ci (par exemple dans onPause ()):
Je pense que c'est le moyen fiable de suivre la visibilité des activités.
la source
Serait
Activity.onWindowFocusChanged(boolean hasFocus)
utile ici? Cela, plus un indicateur au niveau de la classe, quelque chose commeisFocused
celuionWindowFocusChanged
défini, serait un moyen facile de dire à tout moment de votre activité si elle est ciblée ou non. À la lecture de la documentation, il semble que cela définirait correctement «faux» dans toute situation où l'activité n'est pas directement au «premier plan» physique, comme si une boîte de dialogue est affichée ou si la barre de notification est abaissée.Exemple:
la source
Si vous utilisez EventBus , il s'agit d'une méthode appelée
hasSubscriberForEvent
qui peut être utilisée pour vérifier si unActivity
est focalisé.la source
J'avais l'habitude de faire comme,
si l'activité n'est pas au premier plan
renverra null. : = P
la source