web-dev-qa-db-fra.com

Quelle est la différence entre onPause () et onStop () () de Android Activités?)?

De Android doc ici http://developer.Android.com/reference/Android/app/Activity.html , il est indiqué que "l'activité passe au premier plan" sera appelé onPause(), et 'L'activité n'est plus visible' appellera onStop().

Est-ce que "l'activité entre au premier plan" n'est pas la même chose que "l'activité n'est plus visible"? Pouvez-vous s'il vous plaît me dire quelle est la différence entre eux?

137
michael

Non, si une activité passe au premier plan, cela ne signifie pas nécessairement que l'autre activité est complètement invisible. Considérons le cas suivant:

Activity with the theme Theme.Dialog

Ici, nous voyons les deux activités en même temps. La première activité avec les champs est masquée par une autre activité et l'utilisateur ne peut plus interagir avec elle. Cependant, il est toujours visible avec toutes les conséquences qui en résultent.

Cela pose la question de savoir quelle activité est considérée comme totalement opaque et couvre tout l'écran et quelle activité n'en est pas une. Cette décision est basée sur la fenêtre contenant l'activité. Si la fenêtre a un drapeau windowIsFloating ou windowIsTranslucent, alors l'activité est considérée comme ne rendant pas invisible le contenu sous-jacent, sinon elle le fera et provoquera onStop() être appelé. Le code correspondant se trouve dans com.Android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.Android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.Android.internal.R.styleable.Window_windowIsTranslucent, false);
101
Malcolm

Si vous pouvez toujours voir une partie de celui-ci (Activity venant au premier plan, soit qu'il n'occupe pas tout l'écran, ou qu'il soit quelque peu transparent), onPause() sera appelé. Si vous ne pouvez en voir aucune partie, onStop() sera appelée.

Une boîte de dialogue **, par exemple, peut ne pas couvrir la totalité de la précédente Activity, et il serait temps d'appeler la fonction onPause().

** Je ne fais pas référence à un Android Dialog ici, mais plutôt à une idée conceptuelle de quelque chose qui apparaît et ne masque qu'une partie de l'écran de l'utilisateur. Cette note a été ajoutée pour clarifier une remarque basée sur un commentaire de @GMsoF ci-dessous

33
nicholas.hauschild

Être au premier plan signifie que l'activité a le focus d'entrée. Par exemple, une activité peut être visible mais partiellement masquée par une boîte de dialogue active. Dans ce cas, onPause() sera appelée, mais pas onStop(). Lorsque le dialogue disparaîtra, la méthode onResume() de l'activité sera appelée (mais pas onStart()).

10
Ted Hopp

Pratiquement , il faut considérer la différence entre “onPause ()” et “onPause () + onStop ()”.

Chaque fois qu'une nouvelle activité se produit et occupe un espace partiel de l'écran. Votre activité précédente est donc encore visible dans une certaine mesure. Dans ce cas, l'activité en cours d'exécution n'est pas poussée vers la pile arrière. Donc, ici, seule la méthode onPause () est appelée .

D'autre part, si une nouvelle activité se produit et occupe tout l'écran, de sorte que votre activité précédemment exécutée a disparu. Dans ce cas, votre activité en cours est déplacée vers la pile arrière. Ici, onPause () + onStop () sont appelés.

Aux résumés-

onPause () - L'écran est partiellement couvert par une autre nouvelle activité. L'activité n'est pas déplacée vers la pile arrière.

onPause () + onStop () - L'écran est entièrement couvert par une autre nouvelle activité. L'activité est déplacée vers la pile arrière.

En savoir plus sur - Back Stack .

2
Yash

J'ai rencontré de nombreux problèmes avec les méthodes onPause et onStop. Je vais donc clarifier trois scénarios que j'ai rencontrés:
1. Lorsque vous cliquez sur le bouton de l'application récente, aucune méthode de cycle de vie n'est appelée, mais onWindowFocusChanged (booléen hasFocus) est appelé avec la valeur hasFocus passée à false. Dans Android version avant 5, méthode onPause utilisée pour être appelé, en appuyant sur le bouton de l'application récente.

2. Quand une activité semblable à une autre apparaît au-dessus de votre activité, comme indiqué par Malcolm , le bouton onPause est appelé. Si une nouvelle activité occupant tout l'écran est appelée, onStop est appelé lors d'une activité précédente. Android dialogue de permission permet également à votre activité d'appeler onPause.

3. Si l'écran expire pour votre activité, onPause est appelée. Après quelque temps, si vous n'ouvrez pas l'écran, onStop sera appelé.

Aussi une chose importante mentionnée par le ateiob qui complète la réponse

Une activité en pause est complètement active (elle conserve toutes les informations sur les états et les membres et reste attachée au gestionnaire de fenêtres). Une activité arrêtée conserve également toutes les informations d'état et de membre, mais n'est plus attachée au gestionnaire de fenêtres.


J'espère que ça aide.

0
royatirek

chaque fois qu'une nouvelle ACTIVITY démarre, la onPause de l'activité précédente sera appelée de manière provocante en toutes circonstances.

en réalité, il y aura deux circonstances:

1- une partie de l'activité précédente est visible ou la nouvelle activité est transparente: seul onPause sera appelé.

2- l'activité précédente est complètement couverte par la nouvelle activité: onPause et onStop seront appelés

---- Bon à préciser quelques notes:

REMARQUE 1: si une boîte de dialogue commence par le haut d'une activité, NONE de onPause ou onStop sera appelé.

REMARQUE 2: si c'est une activité dont le thème est défini sur une boîte de dialogue, le comportement sera comme une activité normale.

NOTE 3: apparemment, une boîte de dialogue système telle qu'une boîte de dialogue d'autorisation depuis Marshmallow causera onPause.

0
Amir Ziarati

En termes concis:

onStop() de la méthode du cycle de vie de l'activité précédente est appelée lorsqu'une autre activité est affichée. Lorsque vous avez Dialogue en haut de l’activité, la fonction onPause() est invoquée.

Note: Les activités sont les composants qui remplissent tout votre écran.

Note: Les dialogues ne sont pas des activités, car ils ne remplissent pas complètement l'écran.

0
Uddhav Gautam