Ciclo de vida de la actividad y modo de inicio (1)

Punto

Inserte la descripción de la imagen aquí

Uno, el ciclo de vida de la actividad.

1. Clasificación de las condiciones del ciclo de vida
  • El ciclo de vida en circunstancias normales (el ciclo de vida experimentado por el usuario en el caso de participación)
  • Ciclo de vida en condiciones anormales (el sistema recicla la actividad o se cambia la configuración del dispositivo, lo que hace que la actividad se destruya y se reconstruya)
2. Diagrama del ciclo de vida

Inserte la descripción de la imagen aquí
ps: red de fuente de imagen

3. Ciclo de vida en condiciones normales:

7 tipos:

  • onCreate
  • onRestart
  • onStart
  • En resumen
  • onPause
  • onStop
  • onDestroy

onCreate : El primer método del ciclo de vida, este método es el primero en ir cuando abrimos una actividad.
Qué podemos hacer: trabajo de inicialización. Como la interfaz de carga (setContentView), la inicialización de datos (findviewbyid, etc.)

onStart : indica que se está iniciando la actividad.
Características: la actividad es visible y no aparece en primer plano.
Comprensión: se ha mostrado la actividad, pero no podemos verla.

onResume : Indica que la actividad ya está visible y aparece en primer plano para interactuar con el usuario,
por ejemplo, hay un Botón sobre la actividad y podemos hacer clic en él en este momento.
La diferencia con onStart:
onStart no es visible en primer plano, por lo que no es interactivo. onResume está visible en primer plano, por lo que puede interactuar.

onPause : indica que la actividad se está deteniendo y luego se ejecuta onStop pronto.
Nota: en casos extremos, salte a otras actividades y vuelva rápidamente a la actividad actual. El ciclo de vida de la actividad actual: onPause-> onResume
pero este "retorno rápido" requiere Pronto, por lo general onPause-> onStop-> onRestart-> onStart-> onResume
ps: No puede realizar operaciones que consuman mucho tiempo aquí, puede almacenar algunos datos y la animación se detiene.

onStop : indica que la actividad está a punto de detenerse.

onRestart : la actividad actual se está reiniciando, generalmente debido al comportamiento del usuario, como el cambio de actividad del usuario, o presionar el botón de inicio para regresar al escritorio, cuando el usuario regresa a esta actividad nuevamente, la actividad actual continúa Reiniciar-> onStart-> onResume

onDestroy : la actividad está a punto de ser destruida, la última devolución de llamada en el ciclo de vida de la actividad, donde puede hacer un trabajo de reciclaje y liberar recursos.

4. El proceso de cambio del ciclo de vida en circunstancias normales

Aquí está la interpretación de las siguientes dos actividades:
MainActivity: Hay siete devoluciones de llamada del ciclo de vida y un botón.
Main2Activity: Siete devoluciones de llamada del ciclo de vida

El código es el siguiente (para estas dos actividades, el siguiente proceso de cambio)

MainActivity:

public class MainActivity extends AppCompatActivity {
    
    

    public static final String TAG = "tags";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });
        Log.i(TAG, "onCreate:");
    }

    @Override
    protected void onStart() {
    
    
        super.onStart();
        Log.i(TAG, "onStart");
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.i(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {
    
    
        super.onPause();
        Log.i(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
    
    
        super.onStop();
        Log.i(TAG, "onStop: ");
    }

    @Override
    protected void onRestart() {
    
    
        super.onRestart();
        Log.i(TAG, "onRestart: ");
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }
}


Main2Activity 

public class Main2Activity extends AppCompatActivity {
    
    
    public static final String TAG = "tags";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
      //  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
        setContentView(R.layout.activity_main2);
        Log.i(TAG, "Main2Activity onCreate:");
    }
    @Override
    protected void onStart() {
    
    
        super.onStart();
        Log.i(TAG, "Main2Activity onStart");
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.i(TAG, "Main2Activity onResume: ");
    }
    @Override
    protected void onPause() {
    
    
        super.onPause();
        Log.i(TAG, "Main2Activity onPause: ");
    }

    @Override
    protected void onStop() {
    
    
        super.onStop();
        Log.i(TAG, "Main2Activity onStop: ");
    }

    @Override
    protected void onRestart() {
    
    
        super.onRestart();
        Log.i(TAG, "Main2Activity onRestart: ");
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        Log.i(TAG, "Main2Activity onDestroy: ");
    }
}

(1) Cuando MainActivity se inicia por primera vez:
Inserte la descripción de la imagen aquí

MainActivity experimentada: onCreate-> onStart-> onResume

(2) Al saltar de mainactivity a Main2Activity:
Inserte la descripción de la imagen aquí

MainActivity pasó por: onPause-> onStop
ps: Cuando MainActivity pasa a onPause, la nueva Main2Activity irá primero: Main2Activity onCreate -> Main2Activity onStart -> Main2Activity onResume Luego MainActivity va -> onStop
enfatiza:
1. Si Main2Activity en este momento se ha configurado para ser transparente Para el tema, mainActivity no continúa onStop, solo onPause. Saltando de MainActivity a Main2Activity todavía podemos ver mainActivity, por lo que verificamos que onPause es visible y no en primer plano.
2. El cuadro de diálogo de visualización no afecta el ciclo de vida.

(3) Presione el botón Inicio en MainActivity
Inserte la descripción de la imagen aquí

MainActivity 走 onPause-> onStop

(4) Cuando regresa a MainActivity después de presionar Home
Inserte la descripción de la imagen aquí

En este momento MainActivity ha continuado onRestart-> onStart-> onResume

(5) Inicie mainActivity para saltar a Main2Activity y luego vuelva a mainActivity
Inserte la descripción de la imagen aquí

Como arriba:
1 corresponde a iniciar mainActivity
2 corresponde a saltar a Main2Activity
3 corresponde a regresar a mainActivity

(6) Cuando el usuario abre la actividad principal y presiona la tecla Atrás

Inserte la descripción de la imagen aquí

mainActivity se ha ido onPause-> onStop-> onDestroy

5. Análisis del ciclo de vida

Desde todo el ciclo de vida, onCreate y onDestroy están emparejados, lo que representa la creación y destrucción de la actividad, respectivamente. Y solo se puede llamar una vez.
A partir de si la actividad es visible, onStart y onStop están emparejados, y los dos ciclos de vida pueden ejecutarse varias veces mientras el usuario opera.
Si la actividad está en primer plano, onResume y onPause se emparejan, y los dos ciclos de vida se pueden ejecutar varias veces mientras el usuario opera.

6. Pregunta pensando

Pregunta 1: OnStart y onResume, onPause y onStop son similares a nosotros en términos de descripción, ¿cuáles son las diferencias sustanciales?

Desde el proceso de uso, los dos pares son realmente similares, e incluso podemos mantener solo un par, como onStart y onStop. En ese caso, ¿por qué el sistema Android proporciona excusas aparentemente repetitivas? Según el análisis anterior, sabemos que estos dos pares de interfaces representan significados diferentes. onStart y onStop se recuperan desde la perspectiva de la visibilidad (la primera es visible y la segunda no).
onResume y onPause se vuelven a llamar desde la perspectiva de si es el primer plano (el primero es el primer plano, el segundo no es el primer plano)

Pregunta 2: Suponiendo que la actividad actual es A, si el usuario abre una nueva actividad B en este momento, el onResume de B y el onPause de A se ejecutarán primero

Resultado de ejecución A: onPause-> B: onCreate-> B: onStart-> B: onResume-> A: onStop
1: Referencia de derivación del caso: 4, (2) arriba
2: Encuentre la respuesta en el código fuente del proceso de inicio de la actividad. (Omitido, consulte Exploración de arte de desarrollo de Android)

7. Ciclo de vida en condiciones anormales
Ciclo de vida en condiciones anormales:
  • Cambios en la configuración del sistema relacionados con los recursos
  • Memoria del sistema insuficiente
7.1, los cambios de configuración relacionados con los recursos hacen que la actividad se elimine y se vuelva a crear

Por ejemplo, si la actividad actual está en un estado vertical, si la pantalla se gira repentinamente debido a un cambio en la configuración del sistema, la actividad se destruirá y reconstruirá de forma predeterminada. Por supuesto, también podemos evitar que el sistema vuelva a crear nuestra actividad.

Castaño: Abrimos actividad por defecto

Inserte la descripción de la imagen aquí

Gire la pantalla en este momento:
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

OnSaveInstanceState y onRestoreInstanceState son los dos métodos de devolución de llamada de actividad que agregué. Podemos ver que la actividad se destruye primero y luego se restablece.

7.1.1. Almacenamiento de datos en condiciones anormales:

De hecho, la actividad también tiene dos métodos onSaveInstanceState, onRestoreInstanceState. Se utiliza para almacenar datos en condiciones anormales.

  • onSaveInstanceState (Bundle outState) Cuando la
    actividad finaliza de forma anormal, el sistema llamará a este método para guardar el estado de la actividad.También podemos almacenar la información que queremos guardar cuando ocurra la finalización anormal aquí. (Tenga en cuenta que este método no devolverá la llamada cuando la actividad finalice normalmente)
  • onRestoreInstanceState (Bundle SavedInstanceState)
    Cuando la actividad finaliza de forma anormal y se reconstruye, el sistema llamará a este método y pasará el objeto Bundle guardado por onSaveInstanceState cuando la actividad se destruya como parámetro a onCreate y onRestoreInstanceState, para que podamos determinar si la actividad se ha reconstruido a través de los métodos onRestoreInstanceI . Si se reconstruye, podemos recuperar los datos guardados previamente.

Al mismo tiempo, sabemos que en los métodos onSaveInstanceState y onRestoreInstanceState, el sistema también realiza automáticamente un trabajo de restauración por nosotros.Cuando la actividad se recrea en condiciones anormales, el sistema por defecto nos guarda la estructura de vista de la actividad actual. Y reanude este trabajo para nosotros cuando se vuelva a crear la actividad. Por ejemplo, los datos ingresados ​​en el cuadro de texto, la posición a la que se desplaza ListView, etc., el sistema de estado relacionado con estas vistas se almacenará para nosotros de manera predeterminada y se restaurará. Pero qué sistema de vista puede ayudarnos a restaurar qué datos depende del código fuente de una vista (la vista tiene estos dos métodos para devoluciones de llamada como actividad)

Para guardar y restaurar la jerarquía de vistas, se adopta la idea de comisión (ver Arte de desarrollo de Android)

Ejemplos de recuperación de datos EditText en condiciones anormales:

La devolución de llamada de escritura se usa para restaurar los datos que queremos guardar

 @Override
    protected void onSaveInstanceState(Bundle outState) {
    
    
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
        outState.putString("tom","异常下存数据 :tom");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    
    
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState: ");
        Log.i(TAG, " "+savedInstanceState.get("tom"));
    }

Un cuadro de entrada de texto (datos que el sistema de prueba nos responde automáticamente):
Inserte la descripción de la imagen aquí

Gire la pantalla después de escribir:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Puede ver que los datos se restauran después de que desaparece la devolución de llamada. El sistema de datos en editText nos ayuda a restaurar, y nuestros datos personalizados también se restauran.
Ps: preste especial atención a nuestro EditText debe establecer la identificación en el diseño xml, de lo contrario los datos no se restaurarán Recuperación (prueba profesional, consulte el código fuente de EditText para conocer las razones)

Almacenamos datos en onSaveInstanceState, que se pueden aceptar tanto en onRestoreInstanceState como en onCreate. La diferencia de recepción es la siguiente:

  • onRestoreInstanceState
    Una vez llamados sus argumentos SavedInstanceState debe haber algún valor, no tenemos oración adicional vacía.

  • Si onCreate se inicia normalmente, el valor de su parámetro está vacío, por lo que debe estar en blanco adicional.
7.2. La memoria de recursos insuficiente hace que se eliminen las actividades de baja prioridad

Esta situación no es fácil de simular, pero el proceso de almacenamiento y recuperación de datos y la devolución de llamada de cambio de configuración de recursos son exactamente iguales

Estos son los niveles de actividad prioritarios:

  • La actividad con la
    que interactúa la actividad en primer plano con el usuario tiene la máxima prioridad.
  • La actividad visible pero no en primer plano,
    como un cuadro de diálogo que aparece en la actividad, hace que la actividad siga siendo visible pero no pueda interactuar con el usuario, y la prioridad es inferior a la del primer plano.
  • La actividad en segundo plano
    se ha detenido, por ejemplo, onstop. La prioridad más baja.

Cuando la memoria del sistema es insuficiente, el sistema terminará el proceso donde se encuentra la actividad de destino de acuerdo con la prioridad anterior. Y a través de onSaveInstanceState, onRestoreInstanceState para almacenar y restaurar datos.
Si no hay cuatro componentes en un proceso (proceso vacío), el proceso será cancelado por el sistema pronto. Por lo tanto, algunos trabajos en segundo plano no son adecuados para ejecutarse en segundo plano solo sin los cuatro componentes principales, que pueden eliminarse fácilmente. Una mejor manera es poner el trabajo en segundo plano en el Servicio para garantizar que el proceso tenga cierta prioridad, de modo que el sistema no lo elimine fácilmente.
ps: Proceso en Android (prioridad de mayor a menor): primer plano> visible> proceso de servicio> proceso en segundo plano> proceso vacío

8. Prohibir la recreación de actividades en condiciones anormales.

Lo anterior describe que la actividad se volverá a crear en circunstancias anormales, por lo que ¿se puede evitar que se vuelva a crear la actividad? La respuesta es que algunos asignan el atributo configChanges a la actividad. (como sigue)

Inserte la descripción de la imagen aquí

Los valores de atributo de configChanges son los siguientes:
Valor de atributo sentido
mcc El código de país en la tarjeta SIM que identifica de manera única la IMSI (Identidad internacional de abonado móvil), que se compone de una matriz tridimensional, que es 460 para China. El código mcc para esta identificación ha cambiado
mnc La tarjeta SIM identifica de forma única el código del operador en la IMSI (Identidad de abonado móvil internacional), que se compone de dos dígitos. El sistema TD de China Mobile es 00, China Unicom es 01 y China Telecom es 03. El código mnc de esta identificación ha cambiado
lugar La ubicación local del dispositivo ha cambiado, generalmente significa que se ha cambiado el idioma del sistema
pantalla táctil La pantalla táctil ha cambiado, esto se puede ignorar, no sucederá en circunstancias normales.
teclado El tipo de teclado ha cambiado, por ejemplo, el usuario ha insertado un teclado externo.
keyboardHidden La accesibilidad del teclado ha cambiado. Por ejemplo, el usuario abre el teclado
navegación Los cambios en los métodos de navegación del sistema, como la navegación con trackball, son difíciles de producir y pueden ignorarse
diseño de pantalla El diseño de la pantalla ha cambiado, es probable que el usuario haya activado otro dispositivo de visualización.
fontScale La escala de fuente del sistema ha cambiado, por ejemplo, el usuario selecciona un nuevo tamaño de fuente
uiMode El modo de interfaz de usuario ha cambiado, por ejemplo, si el modo nocturno está habilitado (recién agregado en api 8)
orientación La orientación de la pantalla cambia, este es el más utilizado, como girar la pantalla del teléfono
tamaño de pantalla Cuando cambia la información del tamaño de la pantalla, cuando se gira la pantalla del dispositivo, el tamaño de la pantalla cambiará. Esta opción es especial y está relacionada con la opción de compilación. Cuando minSdkVersion y targetSdkVersion en las opciones de compilación son inferiores a 13, esta opción no causará actividad Reinicie, de lo contrario, la actividad se reiniciará (recién agregado en api 13)
SmallScreenSize Cuando cambia la información del tamaño de la pantalla física del dispositivo, este valor de atributo no tiene nada que ver con la orientación de la pantalla. Solo significa que la pantalla física real cambia, como cuando el usuario cambia al dispositivo de visualización periférico. Igual que screenSize, cuando minSdkVersion en la opción del compilador Cuando tanto targetSdkVersion son inferiores a 13, esta opción no hará que la actividad se reinicie, de lo contrario, hará que la actividad se reinicie (recién agregada en api 13)
layoutDirection Cuando cambia la dirección del diseño, este atributo se utiliza menos. En circunstancias normales, no se puede modificar el layoutDirection (recién agregado en api 17)

ps: Podemos configurar múltiples valores de los atributos anteriores, solo use | para conectar.

De la tabla anterior, encontramos que si no especificamos el valor de atributo específico de configChanges para la Actividad, la actividad se volverá a crear en circunstancias anormales. Hay muchos valores de atributo en la tabla anterior, pero solo hay unos pocos de uso común -> locale, orientación, keyboardHidden. Cabe señalar que screenSize, smallestScreenSize solo está relacionado con la versión compilada y no tiene nada que ver con el entorno operativo.

castaña:

Agregue la devolución de llamada onConfigurationChanged para la actividad

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
    
    
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged: ");
    }

Configuración del archivo de manifiesto:
Inserte la descripción de la imagen aquí
pantalla giratoria:
Inserte la descripción de la imagen aquí

Descubrimos que la actividad no se destruía ni se reconstruía después de rotar la pantalla, sino que continuaba con el método de configuración.

resumen

Esta sección no está terminada: este capítulo solo resume el ciclo de vida de la actividad. Modo de inicio de actividad, las reglas de coincidencia de intentFliter no se han resumido, consulte el resumen de las dos partes restantes:
ciclo de vida de la actividad y modo de inicio (2)

El fin

Leer <Exploración de arte de desarrollo de Android> Resumen de práctica

Supongo que te gusta

Origin blog.csdn.net/qq_38350635/article/details/88855761
Recomendado
Clasificación