Diferencia entre onStart () y onResume ()

176

No puedo entender el significado del onStart()estado de transición. El onResume()método siempre se llama después onStart(). ¿Por qué no se puede onResume()invocar después onRestart()y los onCreate()métodos simplemente se excluyen onStart()? ¿Cual es su propósito?

¿Por qué no podemos vivir sin él onStart()? Todavía lo considero redundante (probablemente porque no entiendo su significado por completo).

Eugene
fuente
Busque aquí el ciclo de vida de la aplicación: d.android.com/guide/topics/fundamentals.html
ykatchou
Esto es fácil Intenta explicar esto CON Fragmentos, ¡ahora eso es programación de Android para ti!
Scott Biggs
Las respuestas a continuación no tienen un código real con explicación. Este es un código que lo explica con fragmentos.
Atul

Respuestas:

306

¿Por qué no puede ser que se invoque onResume () después de que los métodos onRestart () y onCreate () solo excluyan onStart ()? ¿Cual 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 un seudocódigo, así que deme una licencia artística aquí. ;)

Los métodos a DriveToWorkActivityseguir ...

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 llego a una parada temporal. Entonces conduzco y luego alcanzo una luz roja, así que me detengo ... la luz se pone verde y reanudo. Otra luz roja y me detengo, luego verde, así que reanudo. El onPause() -> onResume() -> onPause() -> onResume()ciclo es apretado y ocurre muchas veces durante mi viaje.

El bucle desde que se detiene de nuevo a través de un reinicio (preparación para continuar mi viaje) para comenzar de nuevo es quizás menos común. En un caso, veo la tienda de comestibles y GroceryStoreActivityse inicia (forzándome DriveToWorkActivityal punto de onStop()). Cuando regreso de la tienda, paso onRestart()y onStart()luego reanudo mi viaje.

Podría poner el código que está en onStart()ambos onCreate()y onRestart()no molestarme en anularlo, onStart()pero cuanto más se deba hacer entre onCreate() -> onResume()y onRestart() -> onResume(), más duplicaré las cosas.

Entonces, para volver a cotizar una vez más ...

¿Por qué no puede ser que se invoque onResume () después de que los métodos onRestart () y onCreate () solo excluyan onStart ()?

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

Squonk
fuente
Esto implica que tanto onCreate()y onRestart()compartiría una gran cantidad de código común, ¿verdad?
Dheeraj Vepakomma
1
@Dheeraj: No, no necesariamente. Este es un pseudocódigo y tiene la intención de ilustrar cómo se Activitypuede usar cada etapa del ciclo de vida. La etapa de creación onCreate(...)bien puede hacer mucho cuando se trata de instanciar miembros de instancias (elementos de la interfaz de usuario, etc.), pero un 'reinicio' no debería necesitar hacer eso. En realidad, muchos Activitiesno necesitan implementar más que eso onCreate(...), onResume()y onPause()los otros métodos están disponibles para casos en los que deba hacer otras cosas y la clave es entender dónde colocar el código.
Squonk
1
Es por eso que he llegado a odiar la API de Android en comparación con iOS e incluso WP7 ... He estado haciendo un juego que se ejecuta en los tres en C # y tengo que decir que estoy muy decepcionado con Google y Android. Parece que faltan en el departamento de diseño de Lenguaje / API. Espero que otros sistemas operativos de teléfonos Linux se hagan cargo, porque en general voto por el código abierto ...
zezba9000
2
@Tim: OK, inventa un mejor diseño. ¿Cómo lidiarías con un escenario en un teléfono móvil cuando alguien está usando una aplicación (tu aplicación) y de repente recibe una llamada telefónica? El diseñador de la aplicación no llama explícitamente a los Activitymétodos del ciclo de vida: es el sistema operativo Android el que lo hace y lo hace de manera muy eficiente (suponiendo que el desarrollador de la aplicación sepa lo que están haciendo y también los códigos de manera eficiente). Si haces mucho desarrollo de Android, te darás cuenta de por qué las cosas funcionan de la manera en que lo hacen: no es 100% perfecto, pero es bastante bueno.
Squonk
9
Creo que la respuesta de Nilesh a continuación es mucho más clara. La diferencia clave entre onStarty onResumees la de 'visibilidad' e 'interacción del usuario'. Esta metáfora de conducir un automóvil es confusa y no es realmente útil.
KJ
142

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 aún no puede "interactuar" con ella porque puede estar solapada con algún otro pequeño diálogo. Esta capacidad de interactuar con el usuario es la que diferencia onStart y onResume. Piense en ello como una persona detrás de una puerta de cristal. Puedes ver a la persona pero no puedes interactuar (hablar / escuchar / darle la mano) con ella. OnResume es como el abridor de puerta después del cual puede comenzar la interacción.

Además, onRestart () es el menos comprendido. Podemos hacernos la pregunta de por qué no ir directamente a onStart () o onResume () después de onStop () en lugar de onRestart (). Se vuelve más fácil de entender si notamos 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" las cosas que se mostrarán

Entonces sus estructuras de código podrían ajustarse a algo como:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Toda la confusión se debe a que Google eligió nombres no intuitivos en lugar de los siguientes:

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

Nilesh Pawar
fuente
44
Cuando se lo explico a los estudiantes, uso maybeOnInvisible () en lugar de onStop (). Y use maybeOnDestroy () en lugar de onDestroy (). Estos nombres funcionan bien como explicaciones que encuentro. Pensé, no quisiera que Google cambie realmente a estos nombres.
Stephan Branczyk
Me gustan sus nombres sugeridos, ayudan a hacer un poco de sentido de esta parte de la API de Android ridícula. Todavía tengo una pregunta en general sobre el ciclo de vida. En todos los diagramas muestra que hay una ruta desde onPause directamente a onResume. No creo haber visto ese camino realmente seguido en ningún caso. Siempre toma el camino de onStop a onStart. ¿Qué desencadenaría el otro camino?
Dewey Vozel
@StephanBranczyk ¿por qué usas quizás ... ()? ¿Por qué "tal vez"?
Marian Paździoch
1
@Damnum, para la explicación más reciente del ciclo de vida de la Actividad, le sugiero que consulte el curso intermedio Android Udacity creado por Google. Es gratis, suponiendo que haga clic en el botón azul para acceder a sus materiales de forma gratuita, y no en el botón de prueba (ni en el botón de nanogrado). udacity.com/course/developing-android-apps--ud853
Stephan Branczyk
1
@Damnum, te sugiero que hagas esa pregunta en el foro de udacity relacionada con el video que miraste. Pero básicamente, creo que depende del diálogo que se use, ya sea una actividad de diálogo o solo un diálogo.
Stephan Branczyk
29

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

Vea este enlace para referencia.

Sergey Glotov
fuente
10

El libro "Hola, Android, presentando 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. Vea 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 principiantes de Android.

Martin Booka Weser
fuente
2
Buena imagen y buen libro, pero aún así no da una respuesta por qué realmente necesitamos el método onStart () y qué cosas especiales podemos hacer en él que no podemos hacer en onResume ().
Eugene
8
NO se llama a onStart (), si la aplicación se detuvo. Su aplicación está "en pausa" si otra aplicación gana el foco pero NO la oculta por completo. Por lo tanto, puede hacer cosas diferentes en el estado "en pausa" de lo que haría en el estado "Detenido". Por lo tanto, puede hacer cosas diferentes si su aplicación simplemente se "reanuda" desde el estado de pausa de lo que haría si su aplicación se "inicia" desde el estado detenido o desde el inicio completo. ¿Eso ayuda?
Martin Booka Weser
7

Un ejemplo particularmente intenso es cuando decides mostrar un Diálogo administrado desde una Actividad usando showDialog(). Si el usuario gira la pantalla mientras el cuadro de diálogo aún está abierto (lo llamamos "cambio de configuración"), la Actividad principal pasará por todas las llamadas de ciclo de vida hasta el final onDestroy(), se volverá a crear y volverá a subir a través de los ciclos de vida. Sin embargo, es posible que no espere eso onCreateDialog()y onPrepareDialog()(los métodos que se llaman cuando lo hace showDialog()y ahora de nuevo automáticamente para recrear 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 visible parte de la actividad principal. ¡Es un detalle pero sí importa!

pjv
fuente
7

onStart()

  1. Llamado después de onCreate (Bundle) o después de onRestart () seguido de onResume () .
  2. puede registrar un BroadcastReceiver onStart()para monitorear los cambios que afectan su interfaz de usuario, debe cancelar su registro en onStop ()
  3. Las clases derivadas deben llamar a la implementación de este método por parte de la superclase. Si no lo hacen, se lanzará una excepción.

onResume()

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

onStart() normalmente despacha el trabajo a un subproceso en segundo plano, cuyos valores de retorno son:

  • START_STICKY para reiniciar automáticamente si se mata, para mantenerlo activo.

  • START_REDELIVER_INTENT para reinicio automático y vuelva a intentar si el servicio se eliminó antes de stopSelf ().

onResume()el sistema operativo lo llama después de que el dispositivo se pone en suspensión o después de que una alerta u otra actividad secundaria de pantalla parcial deja visible una parte de la ventana anterior, por lo que es necesario reiniciar los campos (dentro de una estructura de prueba con una captura de excepciones) ) Tal situación no hace onStop()que se invoque cuando el niño cierra.

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

Para obtener más detalles, puede visitar Android_activity_lifecycle_gotcha y Activity Lifecycle

IntelliJ Amiya
fuente
en realidad me detengo cuando mi aplicación pasa a segundo plano
deadfish
5

Ojalá una explicación simple: -

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

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

aprofromindia
fuente
4

onStart()significa que se Activityingresa en estado visible y se crea 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.

Abhi
fuente
1

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

Si está utilizando el indicador SINGLE_TOP y envía algunos datos a su actividad, utilizando intenciones adicionales, solo podrá acceder a él en onNewIntent (), que se llama después de onStart () y antes de onResume (). Por lo tanto, generalmente tomará los datos nuevos (tal vez solo modificados) de los extras y los configurará para algunos miembros de la clase, o usará setIntent () para establecer el nuevo intento como el intento de actividad original y procesar los datos en onResume ().

Corneliu Dascălu
fuente
0

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

onResume()Llamado justo antes de que la actividad comience a interactuar con el usuario. En este punto, la actividad está en la parte superior de la pila de actividades, con la entrada del usuario. Siempre seguido por onPause().

onPause()Se llama cuando el sistema está a punto de comenzar a reanudar otra actividad. Este método se usa generalmente para confirmar cambios no guardados en datos persistentes, detener animaciones y otras cosas que pueden estar consumiendo CPU, etc. Debe hacer lo que hace muy rápidamente, porque la próxima actividad no se reanudará hasta que regrese. Seguido ya sea onResume()si la actividad vuelve al frente o onStop()si se vuelve invisible para el usuario.

androidwifi
fuente
0

No estoy seguro de si esto cuenta como una respuesta, pero aquí está el video de YouTube del curso de Google (Desarrollo de aplicaciones de Android con Kotlin) que explica la diferencia.

  • Al iniciar se llama cuando la actividad se hace visible
  • En pausa se llama cuando la actividad pierde el foco (como un cuadro de diálogo emergente)
  • Al reanudar se llama cuando la actividad se enfoca (como cuando desaparece un diálogo)
hba
fuente