Diferencia entre onStart () y onResume()


No puedo entender el significado de onStart() estado de transición. El método onResume() siempre se llama después de onStart(). ¿Por qué no puede ser que el onResume() se invoque después de los métodos onRestart() y onCreate() simplemente excluyendo onStart()? ¿Cuál es su propósito?

¿por Qué no podemos vivir sin onStart(). Todavía lo considero redundante (probablemente porque no entiendo su significado completamente).

 160
Author: Deepzz, 2010-12-29

11 answers

¿Por qué no puede ser que onResume() se invoque después de los métodos onRestart() y onCreate() excluyendo solo onStart()? ¿Cuál es su propósito?

OK, como mi primera respuesta fue bastante larga, no la extenderé más, así que intentemos esto...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

TENGA EN CUENTA: He omitido deliberadamente las llamadas a cosas como super.onCreate(...), etc. Esto es pseudo-código así que dame alguna licencia artística aquí. ;)

Los métodos para DriveToWorkActivity siguen...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

OK, entonces es otra larga (lo siento amigos). Pero aquí está mi explicación...

onResume() es cuando empiezo a conducir y onPause() es cuando me detengo temporalmente. Así que conduzco y luego llego a una luz roja, así que hago una pausa...la luz se pone verde y continúo. Otra luz roja y hago una pausa, luego verde, así que continúo. El onPause() -> onResume() -> onPause() -> onResume() bucle es apretado y ocurre muchas veces a través de mi viaje.

El bucle de ser detenido de nuevo a través de un reinicio (preparándose para continuar mi viaje) a comenzar de nuevo es quizás menos común. En un caso, veo la tienda de comestibles y el GroceryStoreActivity se inicia (forzando mi DriveToWorkActivity al punto de onStop()). Cuando regreso de la tienda, paso por onRestart() y onStart() luego continúo mi viaje.

Podría poner el código que está en onStart() en onCreate() y onRestart() y no molestarme en anular onStart() en absoluto, pero cuanto más se necesita hacer entre onCreate() -> onResume() y onRestart() -> onResume(), más estoy duplicando las cosas.

Así que, para volver a citar una vez más...

¿Por qué no puede ser el onResume () se invoca después de los métodos onRestart () y onCreate () excluyendo solo onStart ()?

Si no anula onStart() entonces esto es efectivamente lo que sucede. Aunque el método onStart() de Activity se llamará implícitamente, el efecto en su código es efectivamente onCreate() -> onResume() o onRestart() -> onResume().

 278
Author: Squonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-12 06:43:50

Respuesta corta:

No podemos vivir sin onStart porque ese es el estado en el que la actividad se vuelve "visible" para el usuario, pero el usuario no puede "interactuar" con ella todavía puede ser porque se superpone con algún otro pequeño diálogo. Esta capacidad de interactuar con el usuario es la que diferencia a onStart y onResume. Piensa en ello como una persona detrás de una puerta de cristal. Puedes ver a la persona pero no puedes interactuar (hablar/escuchar/agitar las manos) con él. onResume es como el abridor de la puerta después que usted puede comenzar la interacción.

Adicionalmente onRestart() es la menos entendida. Podemos preguntarnos por qué no ir directamente a onStart() o onResume() después de onStop () en lugar de onRestart (). Se hace más fácil de entender si observamos que onRestart () es parcialmente equivalente a onCreate () si se omite la parte de creación. Básicamente, ambos estados conducen a onStart () (es decir, la Actividad se hace visible). Así que ambos estados tienen que "preparar" las cosas que se mostrarán. onCreate tiene la responsabilidad adicional de" crear " el material que se mostrará

Así que sus estructuras de código podrían encajar en algo como:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Toda la confusión es causada ya que Google eligió nombres no intuitivos en lugar de algo como sigue:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

El Diagrama de Actividad podría interpretarse como:

Ciclo de Vida de la Actividad de Android

 125
Author: Nilesh Pawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 12:55:40

onStart() se llama cuando la actividad se vuelve visible para el usuario. onResume() se llama cuando la actividad comenzará a interactuar con el usuario. Es posible que desee hacer cosas diferentes en estos casos.

Ver este enlace para referencia.

 26
Author: Sergey Glotov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 13:55:59

onResume() se llama:

  1. después de onStart()
  2. cuando el Activity viene al primer plano.

De http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle : texto alt

 14
Author: Jonas Alves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 10:55:17

El libro "Hola, Android, Presentación de la Plataforma de Desarrollo Móvil de Google" da una buena explicación del ciclo de vida de las aplicaciones de Android. Afortunadamente tienen el capítulo particular en línea como un extracto. Ver el gráfico en la página 39 en http://media.pragprog.com/titles/eband3/concepts.pdf

Por cierto, este libro es muy recomendable para los principiantes de Android!

 9
Author: Martin Booka Weser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-06 17:54:39

Un ejemplo particularmente enérgico es cuando decides mostrar un diálogo administrado desde una Actividad usando showDialog(). Si el usuario gira la pantalla mientras el diálogo todavía está abierto (llamamos a esto un "cambio de configuración"), entonces la Actividad principal pasará por todas las llamadas finales del ciclo de vida hasta onDestroy(), se recreará y volverá a subir a través de los ciclos de vida. Lo que no puede esperar sin embargo, es que onCreateDialog() y onPrepareDialog() (los métodos que se llaman cuando se hace showDialog() y ahora de nuevo automáticamente a volver a crear el diálogo - automáticamente ya que es un diálogo administrado) se llaman entre onStart() y onResume(). El punto aquí es que el diálogo no cubre la pantalla completa y por lo tanto deja parte de la actividad principal visible. ¡Es un detalle,pero importa!

 7
Author: pjv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-08 23:19:31

onStart()

  1. Llamado después de onCreate (Bundle) o después de onRestart () seguido de onResume().
  2. puede registrar un BroadcastReceiver en onStart() para monitorear los cambios que afectan a su interfaz de usuario, Usted tiene que anular el registro en onStop ()
  3. Las clases derivadas deben llamar a través de la super clase aplicación de este método. Si no lo hacen, una excepción será lanzar.

onResume()

  1. Llamado después onRestoreInstanceState (Bundle), onRestart (), o onPause ()
  2. Iniciar animaciones, abrir dispositivos de acceso exclusivo (como la cámara)

onStart() normalmente envía el trabajo a un subproceso de fondo, cuyos valores de retorno son:

  • START_STICKY para reiniciar automáticamente si está muerto, para mantenerlo activo.

  • START_REDELIVER_INTENT para reiniciar automáticamente y volver a intentar si el servicio se mató antes stopSelf().

onResume() es llamado por el sistema operativo después de que el dispositivo se ponga en reposo o después de que una Alerta u otra actividad secundaria de pantalla parcial deje una parte de la ventana anterior visible, por lo que un método necesita volver a inicializar los campos (dentro de una estructura try con una captura de excepciones). Tal situación no hace que onStop() se invoque cuando el niño cierra.

onResume() se llama sin onStart() cuando la actividad se reanuda desde el antecedentes

Para obtener Más detalles, puede visitar Android_activity_lifecycle_gotcha Y Ciclo De Vida De La actividad

 6
Author: IntelliJ Amiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 13:47:04

onStart() significa que Activity entró en estado visible y se creó el diseño, pero no puede interactuar con este diseño de actividad.

Resume() significa que ahora puedes interactuar con el diseño de la actividad.

 4
Author: Abhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 07:46:31

Tenga en cuenta que hay cosas que suceden entre las llamadas a onStart() y onResume(). Es decir, onNewIntent (), que he descubierto dolorosamente.

Si está utilizando el indicador SINGLE_TOP, y envía algunos datos a su actividad, utilizando intent extras, solo podrá acceder a ellos en onNewIntent(), que se llama después de onStart() y antes de onResume(). Por lo general, tomará los datos nuevos (tal vez solo modificados) de los extras y los establecerá en algunos miembros de la clase, o use setIntent() para establecer la nueva intent como la intent de actividad original y procesar los datos en onResume().

 1
Author: Corneliu Dascălu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 15:25:08

Referencia a http://developer.android.com/training/basics/activity-lifecycle/starting.html

onResume() Llamada justo antes de que la actividad comience a interactuar con el usuario. En este punto, la actividad se encuentra en la parte superior de la pila de actividades, con la entrada del usuario yendo a ella. Siempre seguido de onPause().

onPause() Se llama cuando el sistema está a punto de comenzar a reanudar otra actividad. Este método se utiliza normalmente para confirmar cambios no guardados en datos persistentes, animaciones de parada y otros cosas que pueden estar consumiendo CPU, y así sucesivamente. Debe hacer lo que haga muy rápidamente, porque la siguiente actividad no se reanudará hasta que regrese. Seguido por onResume() si la actividad vuelve al frente, o por onStop() si se vuelve invisible para el usuario.

 0
Author: androidwifi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 11:53:43

Esperemos que una explicación simple: -

OnStart () - > se llama cuando la actividad se hace visible, pero podría no estar en primer plano (por ejemplo, un AlertFragment está en la parte superior o cualquier otro caso de uso posible).

OnResume () -> se llama cuando la actividad está en primer plano, o el usuario puede interactuar con la Actividad.

 0
Author: aprofromindia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 12:02:51