Revisión de Android - Actividad

ciclo vital

Ciclo de vida en condiciones normales

Es decir, el ciclo de vida de la actividad desde el inicio normal hasta la destrucción final.

  • onCreate () : Se está creando la actividad. Aquí se pueden realizar algunos trabajos de inicialización, como cargar el diseño, inicializar datos, etc.
  • onRestart () : la actividad se está reiniciando. Cuando la Actividad cambia de invisible a visible (la Actividad actual presiona el botón Inicio para regresar al escritorio o abre una nueva Actividad y luego regresa a esta Actividad, si su instancia no ha sido destruida), se llamará a este método.
  • onStart () : la actividad está comenzando. La actividad ya está visible en este momento, pero todavía está en segundo plano , no puede interactuar con el usuario.
  • onResume () : la actividad ya está visible y ha estado en primer plano e inició la actividad.
  • onPause () : la actividad se está deteniendo. Entonces se llamará a onStop. Algunas operaciones, como almacenar datos y detener la animación, se pueden realizar aquí, pero no debería llevar demasiado tiempo, porque el onResume de la nueva actividad solo se ejecutará después de que se ejecute el método onPause de la actividad anterior.
  • onStop () : la actividad está a punto de detenerse. Puede hacer un trabajo de reciclaje pesado, pero no puede llevar demasiado tiempo.
  • onDestroy () : la actividad está a punto de ser destruida. También se puede hacer algo de reciclaje.

onPause()和onStop()的区别:onPause puede entenderse como la actividad actual pierde el foco, y onStop significa que la actividad actual no es visible. Si la nueva actividad iniciada es una actividad de diálogo (tema transparente), se llamará a onPause, pero no a onStop.

Escenario específico

  • La actividad se inicia por primera vez / El sistema vuelve a abrir la actividad después de la devolución de llamada del ciclo de vida: onCreate → onStart → onResume
  • La actividad A inicia la actividad B, y B vuelve a A, el ciclo de vida de los dos cambios

A comienza B:

B vuelve a A:

La razón por la que el método onStop de A se ejecuta después de que B comienza cuando A comienza B arriba es: las nuevas actividades se inician más rápido y la experiencia del usuario mejora; cuando B retrocede a A, onStop y onDestroy se ejecutan después de que A se reinicia.

  • Al iniciar una nueva actividad o cambiar al escritorio: onPause → onStop.
    Caso especial : si la nueva actividad usa un tema transparente, la actividad actual no volverá a llamar a onStop.
  • Regrese a la actividad original nuevamente: onRestart → onStart → onResume
  • onCreate y onDestroy solo se llamarán una vez en todo el ciclo de vida de la actividad; a partir de si la actividad es visible, onStart y onPause están emparejados y se pueden llamar varias veces; desde si la actividad está en primer plano, onResume y onStop son emparejado y puede ser llamado varias veces.

Ciclo de vida en condiciones anormales

La situación anormal se refiere a:

  • Los cambios en la configuración del sistema hacen que la actividad se elimine y se vuelva a crear.
    Por ejemplo, al girar la pantalla, la configuración del sistema cambia. De forma predeterminada, la actividad se destruirá y se volverá a crear. Pero también puede evitar que el sistema vuelva a crear la actividad.

El ciclo de vida de la rotación de la pantalla cuando la propiedad configChanges no está establecida :
estado de ejecución → onSaveInstanceState () → onStop () → onDestroy () → onCreate () → onStart () → onRestoreInstanceState () → onResume () La
pantalla gira cuando el La propiedad configChanges está establecida El ciclo de vida del caso:
estado de ejecución → onConfigChanged ()

  • La memoria insuficiente del teléfono móvil hace que se eliminen las actividades de baja prioridad.
    División de prioridad de actividad:
    1. Actividad en primer plano : la actividad que está interactuando con el usuario, con la prioridad más alta.
    2. Actividad visible pero no en primer plano : por ejemplo, una actividad que aparece un cuadro de diálogo.
    3. Actividad en segundo plano : la actividad que se ha suspendido tiene la prioridad más baja.

métodos onSaveInstanceState y onRestoreInstanceState

Estos dos métodos solo se llamarán cuando la actividad finalice de manera anormal. Puede usar el método onRestoreInstanceState o onCreate para determinar si la actividad se ha reconstruido.

La diferencia entre los métodos onCreate y onRestoreInstanceState :

La devolución de llamada onRestoreInstanceState indica que el objeto Bundle no está vacío y no es necesario agregar una sentencia que no esté vacía.

onCreate requiere un juicio no vacío. Se recomienda utilizar onRestoreInstanceState.

  • Cuando llamar

onSaveInstanceState se llama antes que el método onStop, pero no tiene una relación temporal con onPause;

onRestoreInstanceState es posterior al método onStart.

  • Guardar y restaurar la jerarquía de vistas

Cuando la Actividad finaliza de forma anormal, le encomendará a Window que guarde los datos, y le confiará al contenedor de nivel superior (DecorView) que guarde los datos, y atravesará los elementos secundarios y les notificará que guarden los datos a su vez. es decir, llame a los métodos onSaveInstanceState y onRestoreInstanceState correspondientes.

Evitar que la actividad se reconstruya cuando se cambia la configuración del sistema

Al especificar **configChanges**atributos en la Actividad correspondiente en el archivo AndroidMenifest.xml , cuando se produzcan los cambios de configuración del sistema especificados en configChanges, la Actividad no se reconstruirá, el onConfigurationChangedmétodo se volverá a llamar en este momento y no se llamará a ningún otro método de ciclo de vida. .

Modo de inicio de actividad

Para ver ejemplos, consulte https://www.jianshu.com/p/b4472dc6911e

  • estándar: modo estándar , que también es el modo de inicio predeterminado de Actividad. Cada vez que se inicia una actividad, se creará una instancia de la misma y se agregará a la parte superior de la pila de tareas, independientemente de si ya existe.
    Por ejemplo: hay un botón en la Actividad A, al presionarlo se iniciará la Actividad A hasta startActivity. Si hace clic dos veces seguidas, se crearán un total de tres instancias de Actividad. Debe presionar la tecla de retorno tres veces para salir al escritorio.
  • singleTop: modo de multiplexación de pila superior . Si la nueva actividad que se iniciará ya está en la parte superior de la pila de tareas, no se crearán nuevas instancias y se volverá a llamar a su método onNewIntent ; si no está en la parte superior de la pila de tareas, se creará una nueva instancia creado.
    应用: Actividad saltada por notificación en la barra de notificaciones . También hay que evitar que dos clics consecutivos creen dos instancias de actividad.
  • singleTask: modo de multiplexación en la pila . Cada vez que se inicia la actividad, el sistema primero verificará si hay una instancia de la actividad en la pila de retorno, si ya existe, usará la instancia directamente y sacará todas las actividades por encima de esta actividad de la pila , y volverá a llamar onNewIntent () ; Si no se encuentra, se creará una nueva instancia de actividad y se agregará a la parte superior de la pila de tareas.
    应用: Actividad en la página principal de la mayoría de las aplicaciones
  • singleInstance: modo de instancia única . La Actividad recién iniciada se colocará por separado en una pila de tareas recién creada.
    应用: Llamada entrante o página de alarma

onNewIntent ()

En circunstancias normales, si el modo de inicio de una actividad es singleTask o singleTop, cuando la actividad se inicia por primera vez, se creará una nueva instancia en la pila, es decir, onCreate () → onStart () → onResume () será llamado ; Si ya hay una instancia de esta Actividad en la pila (singleTop corresponde a la parte superior de la pila), llamará: onNewIntent () → onResart () → onStart () → onResume ().

onNewIntent()的陷阱

Llamar a getIntent () en onNewIntent () siempre solo obtendrá el primer objeto Intent. Pero podemos llamar a setIntent () para actualizar el objeto Intent.

Es decir, la siguiente forma de escritura obtendrá el último Intent cada vez:

@Override
protected void onNewIntent(Intent intent) {
    
    
    super.onNewIntent(intent);
    setIntent(intent);         //设置新的intent
    int data = getIntent().getIntExtra("tanksu", 0);//此时的到的数据就是正确的了
}

taskAffinity

Cada actividad tiene una propiedad taskAffinity, que indica la tarea en la que desea ingresar. Si una Actividad no especifica explícitamente la taskAffinity de la Actividad, entonces su atributo es igual a la taskAffinity especificada por la Aplicación. Si la Aplicación no especifica tampoco, entonces el valor de la taskAffinity es igual al nombre del paquete.

SingleTask y taskAffinity se usan juntos para especificar a qué pila se agrega la actividad iniciada

Especificar el modo de inicio de la actividad.

Dos métodos, pero la prioridad de establecer el bit de bandera es mayor que especificar el modo de inicio en xml.
En segundo lugar, existen diferencias entre los dos métodos: el primero no puede establecer directamente el indicador FLAG_ACTIVITY_CLEAR_TOP para la actividad; el segundo no puede especificar la singleInstance para la actividad.

  • Especifique el atributo launchMode para la actividad en el archivo de manifiesto
  • Establezca el bit de bandera en Intent. Es decir, el objeto Intent pasado en startActivity se addFlagsestablece mediante el método ** **.

Banderas de uso común en Actividad

  • FLAG_ACTIVITY_SINGLE_TOP : igual que el modo de inicio singleTop
  • FLAG_ACTIVITY_NEW_TASK : Igual que el modo de inicio de singleTask
  • FLAG_ACTIVITY_CLEAR_TOP : generalmente debe usarse junto con FLAG_ACTIVITY_NEW_TASK, y el **singleTask**efecto es el mismo en este momento . Si la Actividad iniciada está configurada en el modo estándar, ella y la instancia de Actividad en ella saldrán de la pila, y una instancia de esta Actividad se volverá a crear y agregar a la parte superior de la pila.
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : Las actividades con esta marca no aparecerán en la lista de actividades históricas.

La diferencia entre el modo de inicio y las banderas

La principal diferencia entre el modo de inicio y la BANDERA es que el primero es fijo y codificado en el archivo xml;

Este último es componible y más flexible.

Por ejemplo: cuando no es adecuado para usar SingleTask en la mayoría de los escenarios, pero algunos escenarios requieren su función de borrar la Actividad superior en la pila, entonces elige la combinación de modo singleTop + clearTop FLAG, entonces, en la lista lo configura es singleTop, solo en la escena donde necesita borrar el efecto, agregue dinámicamente FLAG al código para usar en combinación.

Supongo que te gusta

Origin blog.csdn.net/why1092576787/article/details/114947742
Recomendado
Clasificación