Entrevistador de Android: No puedo responder estas preguntas. ¿Realmente entiendes el modo de inicio de Actividad?

Introducción

Cuando el entrevistador le pide que introduzca el modo de inicio de actividad, la mayoría de las personas pueden decir dos frases sobre la reutilización de la parte superior de la pila y la reutilización en la pila. Sin embargo, ¿está seguro de que realmente comprende el modo de inicio?

Si puede responder las siguientes preguntas, puede salir directamente de la interfaz actual.

Suponga que existen las siguientes cuatro actividades:

  1. Un estandar)
  2. B (singleTop)
  3. C (tarea única)
  4. D (singleInstance)

Su secuencia de inicio es ABCDABCD, describa los cambios en la pila de actividades.

Análisis basado en interacciones

Ejemplo:
1. Después de que el usuario hace clic en el icono de la aplicación en la pantalla principal para iniciar la aplicación, aparece la primera interfaz de Actividad: A , y abre las siguientes interfaces  A -> B -> C -> D a su vez .
2, a continuación, pulse la tecla de inicio para volver a la pantalla principal, haga clic en el icono para iniciar la aplicación de nuevo, nos encontraremos con la interfaz o emergente  D  en lugar de la pantalla  A .
3. Cuando hacemos clic continuamente en el botón Atrás, la interfaz de la aplicación se mostrará en orden inverso según la secuencia de inicio, es decir, D -> C -> B -> A -> pantalla de inicio .

A través de este ejemplo, podemos saber que el sistema Android guarda temporalmente un conjunto de cadenas de inicio de Actividad para la aplicación y registra la secuencia de inicio, lo que lleva al primer concepto: tareas .

tarea

Permítanme hablar primero sobre la definición de la tarea. Los funcionarios de Android llaman a la serie de actividades mencionadas anteriormente encadenadas para completar ciertas tareas como  tareas .

Todos sabemos que cada Actividad es una interfaz independiente, es con el concepto de tareas que se pueden vincular múltiples Actividades para formar una aplicación completa.

¿Pueden existir varias tareas al mismo tiempo?

por supuesto que puede!

Ejemplo: normalmente usamos nuestros teléfonos móviles para alternar entre los chats de Weibo y WeChat. Cada vez que cambiamos, el sistema guardará la última vez que nos fuimos.

¿Debe la actividad de la tarea provenir de la misma aplicación?

¡por supuesto no!

Ejemplo: cuando configuramos una imagen de perfil de usuario en el software social, generalmente hay dos opciones: foto y álbum de fotos. Si eliges tomar una foto, saltarás al software de la cámara, y si seleccionas un álbum, saltarás al software del álbum de fotos del sistema. A través de la cooperación conjunta entre estos varios programas, se completó una tarea.

Actividad raíz en la tarea

En circunstancias normales, iniciamos la aplicación haciendo clic en el icono de la aplicación en la pantalla de inicio del dispositivo. De manera similar, la pantalla de inicio del dispositivo también es el punto de partida para la mayoría de las tareas, y la actividad de entrada en la aplicación es la actividad raíz de esta tarea. Debe declarar la actividad raíz Particularmente familiarizado con:

<activity
       android:name=".HelloActivity"">
       <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

Cuando el usuario toca el icono de la aplicación en la pantalla de inicio para abrir la aplicación, si la aplicación no se ha utilizado recientemente, se creará una tarea y la entrada Actividad en la aplicación se abrirá como Actividad raíz en la tarea. De lo contrario, simplemente llame la tarea de la aplicación y colóquela en primer plano.

Después de comprender la tarea, probablemente sepamos las reglas de cómo el sistema Android guarda el estado de actividad en los ejemplos anteriores.

Pila de devolución

La tarea es un concepto particularmente virtual, solo está disponible para que los desarrolladores lo comprendan y el almacenamiento real de la Actividad en el sistema es una estructura de datos que sigue el principio de primero en entrar, último en salir: pila. Generalmente se llama pila de retorno ( pila de tareas, pila, de hecho, se llama cualquier cosa).

La pila de devolución es el portador real de la tarea, y todas las actividades de cada tarea se almacenarán en la pila de devolución correspondiente de acuerdo con su orden de apertura. Por lo tanto, el orden de la interfaz de visualización del sistema Android es encontrar primero la tarea donde se mostrará la interfaz y luego buscar la Actividad mostrada en la pila de retorno correspondiente.

Cabe mencionar que debido a la particularidad de la estructura de almacenamiento de la pila de devolución, el exterior solo puede acceder a la Actividad en la parte superior de la pila, que es la que se empuja en último lugar a la pila. Entonces, si una actividad quiere mostrarse en la pantalla, debe existir en la parte superior de la pila.

Empuje y haga estallar

Cuando la actividad actual inicia otra actividad, la nueva actividad se colocará en la parte superior de la pila y se mostrará en la pantalla como foco. La actividad anterior permanece en la pila, pero está en un estado detenido.

Cuando el usuario presiona el botón "Atrás", la Actividad actual aparecerá en la parte superior de la pila (la Actividad se destruye) y la Actividad anterior reanudará la ejecución. Si el usuario continúa presionando "regresar", la actividad correspondiente en la pila aparecerá para mostrar la actividad anterior hasta que el usuario regrese a la pantalla de inicio (o regrese a cualquier actividad que se estaba ejecutando cuando comenzó la tarea). Cuando todas las actividades se eliminan de la pila, la tarea deja de existir. La pila también se reciclará.

Tarea especial

A través del entendimiento anterior, sabemos que si desea abrir una nueva interfaz, debe colocar la instancia de Actividad en la parte superior de la pila de retorno correspondiente a la tarea actual. Esta operación es independientemente de si se ha creado una instancia de la actividad antes o si ya existe en la pila.

Sin embargo, en algunas circunstancias especiales, encontraremos algunas "excepciones".

Ejemplo 1: cuando una aplicación de varias tareas diferentes elige usar el navegador del sistema para acceder a una página web, la aplicación del navegador no crea una actividad en la pila de retorno de cada tarea, sino que coloca todas las páginas web en forma de pestañas. la misma interfaz.

En este ejemplo, la actividad de la aplicación del navegador no se volverá a crear si se ha creado una instancia.

Ejemplo 2: Xiao Ming compartió un fragmento de contenido de Weibo contigo en WeChat. Después de abrirlo, saltaste a la página de detalles de Weibo en la APLICACIÓN de Weibo. Cuando termines de leer el contenido, presiona la tecla de retorno para salir de la interfaz y buscar que no es una devolución. Cuando llegué a la interfaz de chat de WeChat, llegué a la página de inicio de Weibo (o la última vez que estuve en Weibo).

En este ejemplo, aunque la actividad de la página de detalles de Weibo se inicia con la tarea de la aplicación WeChat, no se agrega a la tarea de la aplicación WeChat, sino que se agrega a la pila de tareas de Weibo.

Tareas de gestión

Obviamente, los dos ejemplos anteriores no son infrecuentes en el uso real. Para esta situación especial, necesitamos tareas de administración específicas, y el conocido modo de inicio es solo uno de ellos.

Definir modo de inicio

Definir el modo de inicio de Activity es definir cómo (si) una nueva instancia de Activity se asocia con la tarea actual. Cómo ingresar a la tarea actual (u otra).

Si solo dice que hay cuatro modos de inicio para Actividad, en realidad es inexacto, porque podemos definir diferentes modos de inicio de dos maneras:

  • Utilice la definición en AndroidManifest.xml
    在AndroidManifest.xml中<activity>标签下使用lauchMode属性来指定当前这个activity的启动模式。

  • Usar definición de marca de intención
    在调用startActivity(Intent intent)前,通过调用intent.addFlags()或者intent.setFlags()方法为Intent添加一个标志,用于为将要启动的Activity声明启动模式。

¿Cuál es la diferencia entre los dos?

Los dos métodos anteriores pueden declarar el modo de inicio de la actividad, pero los escenarios de uso son diferentes.

  1. Si queremos que una actividad realice un modo de inicio especial bajo cualquier circunstancia, podemos usar la declaración de método de AndroidManifest.xml.

  2. Si queremos que una actividad se inicie normalmente en la mayoría de los casos, pero en algunos casos para ejecutar un modo de inicio especial, podemos agregar una declaración de bandera en el Intent cuando necesitemos ejecutar un modo de inicio especial.

  3. Si una actividad se declara de ambas formas, la forma de usar la marca Intent tiene una prioridad más alta que AndroidManifest.xml.

  4. Algunos de los modos de inicio definidos en los dos métodos son diferentes. Algunos modos de inicio definidos en la marca Intent no están en AndroidManifest.xml y viceversa.

  5. Los cuatro modos de inicio de los que hablamos a menudo son en realidad los definidos en AndroidManifest.xml.

Use AndroidManifest.xml para declarar el modo de inicio

Al declarar la Actividad en el archivo de manifiesto, puede utilizar <activity>el launchModeatributo ] [ del elemento para especificar cómo se debe asociar la Actividad con la tarea.

launchMode Hay cuatro modos de inicio que puede asignar a los  atributos:

  • standard
  • singleTop
  • singleTask
  • singleInstance

Independientemente de sus operaciones específicas, primero debemos saber que estos cuatro modos de inicio se pueden dividir en dos categorías:

  • standardY singleTop
    la actividad de este tipo de modo de inicio se puede instanciar varias veces, sus instancias se pueden colocar en cualquier tarea y se pueden ubicar en cualquier lugar de la pila de retorno.
  • singleTaskY para las actividades singleInstance
    con este tipo de modo de inicio, solo pueden tener una instancia y la instancia solo puede existir en una sola tarea.

estándar: modo estándar

El modo de inicio predeterminado, al iniciar una actividad, crea directamente una nueva instancia y la coloca en la parte superior de la pila de tareas que la inició.

singleTop: modo de multiplexación superior de pila

La única standarddiferencia en este modo es que si singleTopuna instancia de esta actividad ya existe en la parte superior de la pila de la tarea actual cuando se inicia la actividad en el modo, entonces no se creará una nueva instancia, sino el método de la instancia. será llamado onNewIntent(). Otros son iguales al modo estándar.

singleTask: modo de reutilización en pila

Este modo es un poco especial, primero lo introducimos de acuerdo con el escenario de uso, cuando estemos a punto de iniciar la actividad de este modo, el sistema juzgará si actualmente existe la pila de tareas que desea:

  1. Ninguna pila de tareas quiere
    系统会新创建一个任务,并将该activity实例化作为该任务的根activity。

  2. Tiene la pila de tareas que necesita
    这时候系统会找到该任务栈,如果任务栈里只有它自己则直接调用该activity实例的onNewIntent()方法。如果任务栈中它的上方还存在别的activity,那么这些activity会被全部弹出栈。

En cuanto a cuál es "la pila de tareas que quiere", la analizaremos por separado a continuación.

singleInstance: el modo Singleton
es básicamente el singleTaskmismo, creará una tarea separada para la actividad y se puede reutilizar. Sin embargo, la actividad en este modo no permite que existan otras actividades en la misma tarea que él mismo, y cualquier actividad iniciada por esta actividad se abrirá en otras tareas.

Utilice la bandera de intención para declarar el modo de inicio

De esta manera, puede agregar una bandera al Intent llamando al método intent.addFlags(int flags)o intent.setFlags(int flags), que se usa para declarar el modo de inicio para que se inicie la Actividad.

Antes de comenzar la introducción, se debe hacer algo de alfabetización:

  1. Una lata Intención configurar múltiples señales, por lo que hay addflags()y setFlags()dos métodos de por qué.
  2. Los parámetros que establecen la bandera para Intent son constantes estáticas de la clase Intent.
  3. Establecer el indicador de intención no es solo la función de establecer el modo de inicio de la actividad, sino también establecer diferentes parámetros y otras funciones.
  4. Hay muchos logotipos que pueden operar el modo de inicio de actividad en el logotipo de Intent. Solo presentamos los tres típicos.

Intent.FLAG_ACTIVITY_SINGLE_TOP El modo de inicio de la
misma AndroidManifest.xmlmanera singleTop.

Intent.FLAG_ACTIVITY_NEW_TASK es el modo de inicio de la
misma AndroidManifest.xmlmanera singleTask.

Intent.FLAG_ACTIVITY_CLEAR_TOP
Si la actividad que se va a iniciar ya existe en la pila de tareas actual, aparecerá y destruirá todas las actividades por encima de ella, y llamará al onNewIntent()método de la instancia de actividad en lugar de iniciar una nueva instancia de la Actividad.

Es singleTaskun poco parecido pero no igual, no AndroidManifest.xmlhay un valor correspondiente en el método.

singleTaskFLAG_ACTIVITY_CLEAR_TOPFunciones incluidas por defecto .

Tareas relacionadas

En el análisis singleTask, se mencionó que antes de iniciar la actividad en este modo, buscará la "pila de tareas que desea", entonces, ¿cómo encontrarla? Esto conduce a los atributos debajo de la etiqueta del AndroidManifest.xmlmedio .<activity>taskAffinity

atributo taskAffinity

taskAffinity atributo nombre científico relevancia de la tarea, para decirlo sin rodeos, este parámetro puede especificar el nombre de la pila de tareas a la que pertenece la actividad actual, y el valor de este atributo es una cadena:

Ejemplo:android:taskAffinity="com.test.demo.task1"

Si <activity>no especifica este atributo en la etiqueta, usará <application>el taskAffinityatributo de la <application>etiqueta . Si no se especifica en la etiqueta, usará el nombre del paquete como valor predeterminado.

taskAffinity 与 singleTask

Después de comprender las taskAffinitypropiedades, estamos reorganizando el singleTaskmodo de inicio.

  • Si especificamos el taskAffinityvalor del atributo, al igual que en el análisis anterior, creamos una nueva tarea, etc.
  • Si no especificamos taskAffinityel valor del atributo, la nueva actividad es la taskAffinitymisma que el valor del atributo de la tarea actual , por lo que la instancia de la nueva actividad se colocará en la pila de tareas actual.

¿Excepto para singleTask?
Ahora que sabemos que el taskAffinityatributo puede especificar con fuerza la pila de tareas a la que pertenece la actividad, ¿cómo se ve este atributo en otros modos de inicio? Mucha gente en Internet dijo que no había ningún efecto. Yo no lo creía, así que lo probé personalmente y llegué a las siguientes conclusiones:

  1. Cuando lo presenté por primera vez  SingleInstance, decía que singleTaskcrearía una nueva tarea como la misma. Dado que singleTaskse basa en el taskAffinityatributo para determinar si se debe crear una nueva tarea, ¿ singleInstancetambién necesita especificar este atributo?
    ¡La respuesta es no! Siempre que el modo de inicio sea para singleInstanceél, una tarea se abrirá por separado.

  2. SingleToptaskAffinityDespués de especificar el valor del atributo en el modo , cambiará mágicamente a la pila de tareas especificada, excepto que es la misma que antes.

  3. Lo más sorprendente es Standardque también se ve afectado por las taskAffinitypropiedades y cambiará a la pila de tareas especificada, pero cuando iniciamos esta actividad varias veces, no creará instancias varias veces, sino que extraerá la anterior. Para la instancia iniciada, lo que es más especial es que los otros tres modos de inicio llamarán al onNewIntent()método cuando se reutilice la instancia anterior , pero no llamarán al método.

Otras funciones de taskAffinity

Otra función de taskAffinity es que puede redirigir la tarea, lo que significa que esta actividad pertenecía originalmente a la tarea A. Cuando se crea una tarea B con el mismo valor del atributo taskAffinity de la actividad, la actividad se transferirá de la tarea A. Vaya a la tarea B.

Para lograr esta función, también necesitamos allowTaskReparentingla cooperación de atributos:

  1. taskAffinity="A"Agregamos atributos bajo la etiqueta de actividad proporcionada en el archivo de manifiesto android:allowTaskReparenting=true.
  2. Al taskAffinity="B"iniciar la siguiente actividad de tarea, esta actividad está presente en la tarea B, respectivamente.
  3. Cuando taskAffinity="A"la tarea se crea o se coloca en primer plano, la actividad se transferirá a su pila de tareas, ubicada en la parte superior de la pila.

Tarea de limpieza

Si el usuario deja la tarea durante mucho tiempo, el sistema borrará todas las tareas de actividad, excepto la actividad raíz. Cuando el usuario vuelve a la tarea, solo se restaura la actividad raíz. La razón por la que el sistema hace esto es que después de un largo período de tiempo, el usuario puede haber abandonado la operación realizada antes y regresar a la tarea para iniciar una nueva operación.

Puede modificar este comportamiento utilizando las siguientes propiedades de la actividad:

alwaysRetainTaskState
Si esta propiedad se establece en "true" en la actividad raíz de la tarea, no se producirá el comportamiento predeterminado que se acaba de describir. Incluso después de un largo período de tiempo, la tarea aún mantiene todas las actividades en su pila.

clearTaskOnLaunch
Si esta propiedad se establece en "true" en la Actividad raíz de la tarea, siempre que el usuario abandone la tarea y regrese, el sistema borrará la pila solo para la Actividad raíz. Incluso si solo deja la tarea por un corto tiempo, el usuario siempre regresará al estado inicial de la tarea.

finishOnTaskLaunch es
similar a clearTaskOnLaunch, pero es más despiadado: cuando el usuario abandona la tarea y regresa, se borra la actividad de toda la tarea, incluso la actividad raíz, lo que equivale a iniciar la tarea por primera vez.

Aplicación práctica del modo de inicio

Personalmente, creo que los cuatro modos de inicio comunes singleTopno se comprenden bien, y los demás están bien.

singleTop

singleTopLa característica de actividad del modo es que, además de iniciarlo externamente para mostrar información, también puede iniciarse a sí mismo para actualizar la información de la pantalla de la misma manera, lo que reduce los códigos redundantes y reduce los costos de mantenimiento.

Ejemplo: si se le pide que diseñe una APLICACIÓN con una aplicación de búsqueda, la página de inicio tiene un cuadro de búsqueda, ingrese la información y haga clic en el botón de búsqueda para ingresar a la página de resultados y mostrar los resultados. Para comodidad de los usuarios, la página de resultados también tiene un cuadro de búsqueda, que tiene la misma función que el cuadro de búsqueda en la página de inicio. ¿Cómo diseñarías?

singleTask

Este modo de inicio se puede dividir en dos situaciones:

  1. TaskAffinity no está especificado.
    En este momento, la actividad se puede utilizar como la entrada de un módulo en la aplicación

El proceso de inicio es el siguiente: página de inicio de WeChat >> página de chat >> página de configuración de chat >> página de perfil de usuario >> página de chat En este momento, presionamos el botón Atrás para regresar directamente a la página de inicio de WeChat.


  1. Si se especifica taskAffinity, si se abre una nueva tarea usando este modo de inicio, se abrirán dos aplicaciones en la perspectiva del usuario (se verán dos aplicaciones recientes en el administrador de tareas), así que úsela con precaución, puedo pensar en el uso Solo una aplicación de Word abrió dos documentos.

única instancia

En este caso, no importa cuántas tareas lo inicien, existirá como una sola tarea Este modo es extremadamente especial y debe usarse con precaución.

Ejemplo: interfaz de marcación, interfaz de despertador.

Ruta de revisión de la entrevista

No hablaré sobre las palabras adicionales. A continuación, compartiré una ruta de revisión para la entrevista. Si también se está preparando para una entrevista pero no sabe cómo revisar de manera eficiente, puede consultar mi ruta de revisión. Si tiene Si tiene alguna pregunta, no dude en comunicarse entre sí. ¡Vamos!

Aquí hay una dirección para que todos aprendan sistemáticamente:

1. Vea el video para el aprendizaje sistemático

La experiencia de Crud en los últimos años me ha hecho darme cuenta de que realmente soy un luchador en el novato. También es por Crud que mi tecnología está relativamente fragmentada y no lo suficientemente profunda para ser sistemática, por lo que es necesario volver a estudiar . Lo que me falta es conocimiento del sistema, un marco estructural e ideas deficientes, por lo que aprender a través de videos es mejor y más completo. Con respecto al aprendizaje por video, las personas pueden recomendar estudiar en la estación B. Hay muchos videos de aprendizaje en la estación B. El único inconveniente es que son gratuitos y fácilmente obsoletos.

Además, he recopilado varios conjuntos de videos y puedo compartirlos con ustedes si es necesario.

2. Clasificar sistemáticamente los conocimientos y mejorar las reservas

Hay tantos puntos de conocimiento en el desarrollo del cliente y todavía hay tan pocas cosas en la entrevista. Por lo tanto, no hay otros trucos para la entrevista, solo para ver qué tan bien se prepara para estos puntos de conocimiento. Entonces, cuando salga a una entrevista, es bueno ver qué etapa ha alcanzado en su revisión.

Dirección de aprendizaje del sistema:

  • Habilidades esenciales para arquitectos: genéricos Java en profundidad + anotaciones en lenguaje simple + programación concurrente + transmisión y serialización de datos + principios de la máquina virtual Java + reflexión y carga de clases + proxy dinámico + E / S eficiente

  • IU avanzada de Android y código fuente de FrameWork: promoción de IU avanzada + análisis del kernel de Framework + kernel de componentes de Android + persistencia de datos

  • Ajuste de rendimiento general de 360 °: ideas de diseño y optimización de la calidad del código + optimización del rendimiento del programa + optimización de la eficiencia del desarrollo

  • Interpretación de ideas de diseño de marcos de código abierto: diseño de reparación en caliente + interpretación del marco de complementos + diseño del marco de componentes + marco de carga de imágenes + diseño del marco de acceso a la red + diseño del marco de programación adaptable RXJava + diseño de la arquitectura IOC + componente de arquitectura de Android Jetpack

  • Desarrollo del módulo NDK: sistema de conocimiento básico NDK + procesamiento de imágenes subyacentes + desarrollo de audio y video

  • Mini programa WeChat: Introducción al mini programa + Desarrollo de interfaz de usuario + Operación de API + Acoplamiento de WeChat

  • Desarrollo híbrido y Flutter: Html5 project combat + Flutter advanced

Una vez que se han resuelto los conocimientos, es necesario comprobar los puntos que faltan, por lo que para estos puntos de conocimiento he preparado muchos libros electrónicos y notas a la mano. Estas notas proporcionan un resumen perfecto de cada punto de conocimiento.

3. Lea el código fuente, lea las notas de combate reales y aprenda las ideas de Dios

"El lenguaje de programación es la forma en que el programador se expresa, y la arquitectura es la percepción del mundo que tiene el programador". Por lo tanto, si los programadores quieren comprender y aprender rápidamente la arquitectura, leer el código fuente es esencial. Leer el código fuente es resolver problemas + entender cosas y, lo que es más importante: ver las ideas detrás del código fuente; los programadores dicen: lea miles de líneas de código fuente y practique miles de formas.

Incluye principalmente código fuente WeChat MMKV, código fuente AsyncTask, código fuente Volley, código fuente Retrofit, código fuente OkHttp, etc.

4. La víspera de la entrevista, preguntas rápidas

Una semana antes de la entrevista, puede comenzar a correr. Tenga en cuenta que al responder preguntas, la tecnología es la primera prioridad y el algoritmo es básico, como la clasificación, etc., y las preguntas intelectuales, a menos que sean reclutas de la escuela, generalmente no se hacen.

Con respecto a las preguntas de la entrevista, personalmente preparé un conjunto de preguntas de entrevista sistemáticas para ayudarlos a aprender unos de otros:

El contenido anterior es gratuito para compartir con todos, amigos que necesitan la versión completa, haga clic aquí para ver todo el contenido .

Supongo que te gusta

Origin blog.csdn.net/weixin_44339238/article/details/111396988
Recomendado
Clasificación