Différence entre onPause et onStop ()

D’android doc ici http://developer.android.com/reference/android/app/Activity.html , il a dit ‘L’activité entre en premier plan’ appellera onPause() , et ‘L’activité n’est plus visible’ appellera onStop() .

N’est-ce pas que «l’activité passe au premier plan» de la même manière que «l’activité n’est plus visible»? Pouvez-vous s’il vous plaît me dire quelle est la différence entre eux?

Non, si une activité entre en avant-plan, cela ne signifie pas nécessairement que l’autre activité est complètement invisible. Considérons le cas suivant:

Activité sur le thème 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 découlent.

Cela laisse une question de savoir quelle activité est considérée comme complètement opaque et qui couvre tout l’écran et qui ne l’est pas. Cette décision est basée sur la fenêtre contenant l’activité. Si la fenêtre a un drapeau windowIsFloating ou windowIsTranslucent , alors on considère que l’activité ne rend pas les trucs sous-jacents invisibles, sinon elle fait et va onStop() . 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); 

Si vous pouvez toujours voir une partie quelconque (l’ Activity venant au premier plan n’occupe pas tout l’écran, ou est quelque peu transparente), onPause() sera appelé. Si vous ne pouvez en voir aucune partie, onStop() sera appelé.

Une boîte de dialog **, par exemple, peut ne pas couvrir toute l’ Activity précédente, et il serait temps que onPause() soit appelée.

** Je ne fais pas référence à un dialog Android ici, mais plutôt à une idée conceptuelle de quelque chose qui apparaît et qui ne fait que masquer une partie de l’écran de l’utilisateur. Cette note a été ajoutée pour clarifier en fonction d’un commentaire de @GMsoF ci-dessous

Ê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 dialog ciblée. Dans ce cas, onPause() sera appelé, mais pas onStop() . Lorsque la boîte de dialog disparaît, la méthode onResume() l’activité sera appelée (mais pas onStart() ).

Pratiquement , on devrait 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. Donc, votre activité précédente est encore visible dans une certaine mesure. Dans ce cas, l’activité précédemment exécutée n’est pas poussée sur Back Stack. Donc, ici, seule la méthode onPause () est appelée .

D’un autre côté, si une nouvelle activité se produit et occupe tout l’écran pour que votre activité en cours d’exécution disparaisse. Dans ce cas, votre activité précédemment exécutée est déplacée vers Back Stack. Ici, onPause () + onStop () sont appelés.

À des résumés-

onPause () – L’écran est partiellement couvert par une autre nouvelle activité. L’activité n’est pas déplacée vers Back Stack.

onPause () + onStop () – L’écran est entièrement couvert par une autre nouvelle activité. L’activité est déplacée vers Back Stack.

En savoir plus sur – Back Stack .

chaque fois qu’une nouvelle ACTIVITY commence, onPause l’activité précédente sera appelée en toute circonstance.

en fait ce sera deux circonstances:

1- une partie de l’activité précédente est visible ou la nouvelle activité est transparente: seule onPuase sera appelée.

2- l’activité précédente est complètement couverte par une nouvelle activité: onPuase et onStop seront appelées

—- Bon de dire quelques notes:

NOTE 1: si une boîte de dialog commence par une activité AUCUN de onPuase ou onStop sera appelée.

NOTE 2: si c’est une activité dont le thème est défini dans une boîte de dialog, le comportement sera comme une activité normale.

NOTE 3: apparemment une boîte de dialog système comme dialog de permission puisque marshmallow provoquera onPuase .

En mots 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é, onPause() est onPause() .

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

Remarque : les dialogs ne sont pas des activités car ils ne remplissent pas complètement l’écran.

Yeap, j’essaie de comprendre et je peux expliquer cela ci-dessous:

Il y a 2 activités: ActivityA & ActivityB

 public class ActivityA extends Activity implements OnClickListener { // button private Button mBtnChangeActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); initialize(); setEvent(); } private void initialize() { Log.i("Activity A", "Initialize()"); mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); } private void setEvent() { Log.i("Activity A", "setEvent()"); mBtnChangeActivity.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i("Activity A", "onStart"); } @Override protected void onResume() { super.onResume(); Log.i("Activity A", "onResume"); } @Override protected void onPause() { super.onPause(); Log.i("Activity A", "onPause"); } @Override protected void onStop() { super.onStop(); Log.i("Activity A", "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("Activity A", "onDestroy"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_change_activity: Intent activityB = new Intent(this, ActivityB.class); startActivity(activityB); break; default: break; } } 

Voici l’activité B. Suivez mon commentaire dans le code

 public class ActivityB extends Activity implements OnClickListener { // button private Button mBtnChangeActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); initialize(); setEvent(); // if call finish() here, activityA will don't stop, just pause // Activity A will call onStop() when Activity B call onStart() method finish(); } private void initialize() { Log.i("Activity B", "Initialize()"); mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); } private void setEvent() { Log.i("Activity B", "setEvent()"); mBtnChangeActivity.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i("Activity B", "onStart"); } @Override protected void onResume() { super.onResume(); Log.i("Activity B", "onResume"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_change_activity: finish(); break; default: break; } } } 

J’espère que c’est clairement