vida savedinstancestate onrestart intent example ciclo activity android android-activity android-lifecycle

android - savedinstancestate - Diferencia entre onPause y onStop()



onstart android example (6)

Desde el documento de Android aquí http://developer.android.com/reference/android/app/Activity.html , decía ''La actividad entra en primer plano'' llamará a onPause() , y ''La actividad ya no está visible'' llamará a onStop()

¿No es ''actividad entra en primer plano'' lo mismo que ''la actividad ya no es visible''? ¿Puedes decirme cuál es la diferencia entre ellos?


El siguiente diagrama muestra las rutas estatales importantes de una actividad. Los rectángulos cuadrados representan métodos de devolución de llamada que puede implementar para realizar operaciones cuando la actividad se mueve entre estados. Los óvalos de colores son estados importantes en los que puede estar la actividad.


Estar en primer plano significa que la actividad tiene un enfoque de entrada. Por ejemplo, una actividad puede ser visible pero parcialmente oscurecida por un diálogo que tiene foco. En ese caso, se onPause() , pero no a onStop() . Cuando el diálogo desaparece, se onResume() método onResume() la actividad (pero no a onStart() ).


No, si alguna actividad entra en primer plano, eso no significa necesariamente que la otra actividad sea completamente invisible. Considere el siguiente caso:

Aquí vemos ambas actividades al mismo tiempo. La primera actividad con los campos queda oscurecida por otra actividad y el usuario ya no puede interactuar con ella. Sin embargo, todavía es visible con todas las consecuencias resultantes.

Eso deja una pregunta sobre qué actividad se considera completamente opaca y abarca toda la pantalla y cuál no. Esta decisión se basa en la ventana que contiene la actividad. Si la ventana tiene una ventana windowIsFloating o windowIsTranslucent , entonces se considera que la actividad no hace que las cosas subyacentes sean invisibles, de lo contrario lo hace y hará que onStop() sea ​​llamado. El código relevante se puede encontrar en 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 aún puede ver alguna parte (la Activity llega al primer plano no ocupa toda la pantalla, o es algo transparente), se onPause() . Si no puede ver ninguna parte de él, se onStop() .

Un cuadro de diálogo **, por ejemplo, puede no abarcar toda la Activity anterior, y este sería un momento para onPause() a onPause() .

** No me refiero a un cuadro de diálogo de Android aquí, sino a una idea conceptual de algo que aparece y solo oscurece parte de la pantalla del usuario. Esta nota se agregó para aclarar en base a un comentario de @GMsoF a continuación


Yeap, trato de entender y puedo explicar esto a continuación:

Hay 2 actividades: 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; } }

Aquí está la actividad B. Sigue mi comentario en el código

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; } } }

Espero que esto sea claramente


cada vez que se inicie una nueva ACTIVIDAD se onPause desafiantemente a onPause la actividad anterior en cualquier circunstancia.

En realidad, esta será dos circunstancias:

1- una parte de la actividad previa es visible o la nueva actividad es transparente: solo se onPuase a onPuase .

2- La actividad anterior está completamente cubierta por una nueva actividad: tanto onPuase como onStop se onStop

---- Es bueno decir algunas notas:

NOTA 1: si un diálogo comienza en la parte superior de una actividad NINGUNA de onPuase o onStop será llamada.

NOTA 2: si es una Actividad cuyo tema está configurado para un diálogo, el comportamiento será como una actividad normal.

NOTA 3: al parecer, un cuadro de diálogo del sistema, como el diálogo de permisos, ya que onPuase causará onPuase .