81 votes

Android : Dans quelles circonstances l'apparition d'un Dialog entraînerait-elle l'appel de onPause() ?

Un extrait de l'Android Activités (faire défiler vers le bas jusqu'au " durée de vie du premier plan ") dit :

Une activité peut fréquemment passer au premier plan et en sortir - par exemple, pour exemple, onPause() est appelé lorsque le dispositif se met en veille ou lorsqu'un dialogue apparaît .

Je ne comprends pas bien. Dans quelles circonstances cela devrait-il se produire ? Est-ce que onPause() appelé seulement si le contexte de la boîte de dialogue en question est différent de l'activité sur laquelle la boîte de dialogue doit être affichée ?

EDIT : Ajout d'un exemple de code pour illustrer mon doute en détail

Si l'on se fie à la citation du document susmentionné, est-ce que les résultats de mon activité onPause() est appelée lorsque la méthode AlertDialog (ou seulement le Dialog ) dans le code suivant s'affiche ? Devrais-je voir l'entrée de journal "onPause called" lorsque la boîte de dialogue s'affiche ?

Mais je ne vois pas cela arriver. Et ça ne devrait pas non plus, si j'ai bien compris le cycle de vie d'Android ! Alors, qu'est-ce que le document pointe du doigt ?

public class LifeCycleTestActivity extends Activity {

    private static final String TAG = "LifeCycleTest";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick");

                AlertDialog dialog = new AlertDialog.Builder(LifeCycleTestActivity.this).create();
                 dialog.setMessage("You Clicked on the button");
                 dialog.setTitle("Dialog!");
                 dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                 dialog.setCancelable(true);
                 dialog.show();

                /*
                Dialog dialog = new Dialog(LifeCycleTestActivity.this);
                 dialog.setTitle("Dialog!");
                 dialog.setCancelable(true);
                 dialog.show();
                */
            }
        });        
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause() called");
        super.onPause();

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }
}

194voto

hackbod Points 55292

onPause() est appelé lorsque votre activité n'est plus au sommet de la pile d'activités. Un dialogue en soi n'est pas une activité, il ne remplacera donc pas l'activité en cours au sommet de la pile et ne mettra rien en pause.

Un dialogue (en minuscules) ne doit cependant pas être implémenté par une classe Dialog. Par exemple, il n'est pas rare d'en implémenter une avec une activité dont le thème est défini comme celui d'un dialogue. Dans ce cas, l'affichage de la classe dialog-as-an-Activity fera en sorte que la nouvelle activité soit au sommet de la pile, mettant en pause ce qui était là auparavant.

9 votes

Excellente réponse. Je n'avais pas pensé au "dialogue en tant qu'activité". Et le raisonnement selon lequel le onPause() n'est appelé que lorsque le dialogue est en haut de la pile - cela explique aussi pourquoi onPause() n'est pas appelé même lorsque la barre de notification est tirée vers le bas, masquant complètement l'activité.

2 votes

@curioustechizen Il y a tellement de subtilités ici.... Grâce à votre question (et à la réponse de cet incroyable pro de l'équipe Android) j'ai pu comprendre rapidement pourquoi j'observe dans mon application exactement ce que vous avez observé. +1.

1 votes

@hackbod : Ainsi, un dialogue système provoquera onPause(). Je vois cela en regardant les boîtes de dialogue système liées à la permission de Marshmallow !

13voto

Michell Bak Points 6312

J'ai fait pas mal de code avec des boîtes de dialogue, y compris la fonction AlertDialog que vous mentionnez, et j'ai également essayé de vérifier si les onPause() est appelé sur l'activité lorsque la boîte de dialogue s'ouvre, mais jusqu'ici ma conclusion est que l'activité continue simplement à fonctionner et que onPause() ne s'appelle pas .

Pas sûr que cela vous aide, mais au moins vous savez maintenant que d'autres personnes vivent ce que vous vivez :-)

0 votes

En fait, si je comprends bien le cycle de vie, je crois qu'un dialogue NE DOIT PAS déclencher la fonction onPause() . Le comportement observé est donc conforme à ce qui est attendu. C'est juste que je suis tombé par hasard sur cet élément d'information que j'ai cité et auquel j'ai fait un lien. Et cela m'a conduit sur le chemin de la confusion !

2voto

Yuvraj Kakkar Points 116

C'est une erreur que l'activité ne soit plus en haut de la pile d'activité dans la phase onPause.

Conditionner une activité à l'état onPause -

  • Activité partiellement visible, par exemple le dialogue sur l'activité.

  • L'objet Activity est conservé en mémoire, il maintient toutes les informations d'état et de membre, et reste attaché au gestionnaire de fenêtres.

    Par exemple, l'appui sur le bouton d'accueil fait passer l'activité en onPause(). Toujours en haut de la pile.

Dans la figure 1. L'activité 3 sera détruite et retirée de la pile supérieure.

Dans la figure 2. Maintenant, la tâche A passe en arrière-plan mais l'activité X reste en haut de la pile. Si vous surchargez la méthode onPause() dans cet état

enter image description here

Figure 1. Représentation de la manière dont chaque nouvelle activité d'une tâche ajoute un élément à la pile arrière. Lorsque l'utilisateur appuie sur le bouton Back, l'activité en cours est détruite et l'activité précédente reprend.

enter image description here

Figure 2. Deux tâches : La tâche B reçoit l'interaction de l'utilisateur au premier plan, tandis que la tâche A est en arrière-plan, attendant d'être reprise.

1 votes

Dans le scénario que vous avez expliqué, le Activity est toujours au sommet de la pile, mais la tâche elle-même est passée à l'arrière-plan. En gros, l'utilisateur n'interagit plus avec votre Activity - un autre Activity (qu'il s'agisse de votre propre tâche ou de celle d'un autre) a pris le devant de la scène. C'est ce que la réponse acceptée tente d'expliquer.

0voto

FrinkTheBrave Points 1272

Je crois me souvenir avoir lu dans une version antérieure du cycle de vie d'Android que onPause était appelé lorsqu'aucune activité n'était affichée. Par exemple, si une partie de votre activité est encore visible dans une popup, onPause ne sera pas appelé.

Peut-être que d'autres experts peuvent se porter garants de ce comportement ?

0 votes

La partie concernant onPause() étant appelé si aucun des Activity est exposée - c'est généralement vrai, mais pas strictement. Par exemple, lorsque vous abaissez la barre de notification de telle sorte qu'elle masque complètement votre activité, onPause() est toujours no appelé.

0voto

Karl Points 235

Dans mon expérience un peu bizarre onResume est appelé avec dialog.setCanceledOnTouchOutside(true); mais onPause n'est jamais appelé.

Ceci étant dit, je pense que la documentation pourrait se concentrer sur les dialogues du système (par exemple, batterie faible).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X