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
.