web-dev-qa-db-fra.com

Android: Dans quelles circonstances un dialogue apparaissant provoquerait-il d'appeler ()?

Un extrait de Android Activités document (faites défiler jusqu'à la ligne "vie au premier plan") indique:

Une activité peut fréquemment passer du premier plan à l'extérieur. Pour Par exemple, onPause() est appelé lorsque le périphérique se met en veille ou lorsqu'un dialogue apparaît}.

Je ne comprends pas bien ça. Dans quelles circonstances cela devrait-il arriver? onPause() est-il appelé uniquement si le contexte de la boîte de dialogue en question est différent de l'activité au-dessus de laquelle la boîte de dialogue doit être affichée?

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

D'après la citation du document mentionnée ci-dessus, la méthode onPause() de mon activité doit-elle être appelée lorsque la variable AlertDialog (ou simplement la Dialog) du code suivant est affichée? Dois-je voir l'entrée de journal "onPause appelé" lorsque la boîte de dialogue est affichée?

Mais je ne vois pas cela arriver. Et cela ne devrait pas non plus, si j'ai bien compris le cycle de vie d'Android! Alors, quel est le document pointant alors?

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");
    }
}
69
curioustechizen

onPause() est appelée lorsque votre activité n'est plus au sommet de la pile d'activités. Un dialogue en lui-même n'est pas une activité, donc ne remplacera pas l'activité en cours en haut de la pile et ne fera donc rien mettre en pause.

Un dialogue (minuscule) n'a cependant pas besoin d'ê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 sur celui d'une boîte de dialogue. Dans ce cas, l'affichage de dialog-as-an-Activity fera en sorte que la nouvelle activité se trouve en haut de la pile, mettant en pause ce qui était auparavant.

167
hackbod

J'ai utilisé pas mal de code avec les boîtes de dialogue, y compris la variable AlertDialog que vous avez mentionnée, et j'ai également essayé de vérifier si onPause() est appelé pour l'activité lorsque la boîte de dialogue s'ouvre, mais jusqu'ici ma conclusion est que l'activité continue simplement à s'exécuter et que onPause() n'est pas appelé .

Je ne suis pas sûr que cela aide, mais au moins, vous savez maintenant qu'il y a d'autres personnes qui vivent ce que vous vivez :-)

12
Michell Bak

Il est faux que l’activité ne reste plus au sommet de la pile d’activités en phase de pause.

Conditionner une activité à l'état de pause -

  • Activité partiellement visible, par exemple. dialogue sur l'activité.
  • L'objet d'activité est conservé en mémoire, il conserve toutes les informations sur l'état et les membres et reste attaché au gestionnaire de fenêtres.

    par exemple, si vous appuyez sur le bouton principal, l’activité passe à onPause (). Toujours au sommet 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. La tâche A passe maintenant à l'arrière-plan mais Activty X reste au-dessus de la pile. Si vous substituez la méthode onPause () int cet état 

enter image description here

Figure 1. Représentation de la manière dont chaque nouvelle activité dans une tâche ajoute un élément à la pile arrière. Lorsque l'utilisateur appuie sur le bouton Précédent, 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 à l’arrière-plan, en attente de reprise.

2
Yuvraj Kakkar

Je pense me souvenir avoir lu dans une version antérieure d'Android Lifecycle qu'onPause était appelée lorsqu'aucune activité n'était affichée. Autrement dit, si une partie de votre activité est toujours visible dans une fenêtre contextuelle, onPause ne sera pas appelée.

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

0
FrinkTheBrave

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

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

0
Karl

@hackbot 

onPause () est appelé lorsque votre activité n'est plus au sommet de la pile activity>. Un dialogue en lui-même n'est pas une activité. Par conséquent, il ne remplacera pas l'activité actuelle en haut de la pile et ne fera donc rien mettre en pause.

tout dépend de la mise en oeuvre ...

qu'est-ce que un dialogue? est une fenêtre ajoutée à Afficher par WindowManager /// Ainsi, la fenêtre lorsqu'elle s'affiche est au-dessus de tout .... (ordre Z) 

ce qui est activité ... est "chose" qui crée aussi sa fenêtre .... 

quand une boîte de dialogue est affichée ou que sa fenêtre est visible au-dessus d'une activité existante, alors elle remplace partiellement la fenêtre d'activité. Ainsi, l'activité existante passera à l'état partiellement invisible et vous obtiendrez l'appel à onPause () de ActivityThread.

mais pour être sûr, nous devons également considérer ici un on pense ... 

l'état de la fenêtre si une fenêtre autonome est affichée en haut ou est une fenêtre enfant et qu'un de ses parents est une fenêtre d'activité. ... 

alors quand on sait

  • les Window.LayoutParams (FLAGS) que nous utilisons pour ajouter 
  • et quel IBinder est utilisé pour que la fenêtre montre 

nous verrons comment se comportera l’activité lorsque les fenêtres sont affichées les unes sur les autres. Comme chaque fenêtre a un rappel, elle est utilisée par activité ou par dialogue pour gérer son état ... 

composants impliqués: 

  • Android.os.IBinder

  • Android.view.Window

  • Android.view.Window.Callback

  • Android.view.WindowManager

  • Android.view.WindowManager.LayoutParams

  • Android.view.Display

btw: 

si vous voulez connaître les fenêtres à l'écran [applicables uniquement au processus que vous possédez - en tant que fenêtre appartient au processus et que celles-ci sont en mode Sandbox - chaque processus est une machine virtuelle Java distinctant strictement "ART"], vous pouvez utiliser une réplication, voir:

  • Android.view.WindowManagerImpl 
  • Android.view.WindowManagerGlobal
0
ceph3us