Preguntas de la entrevista de Android (último en 2023)

Descargo de responsabilidad: algunas personas dicen que algunas preguntas de la entrevista son anormales. Personalmente, creo que se debe a que nuestra base no es sólida ni profunda. Este artículo proviene de un resumen de las preguntas de una entrevista reciente de Android de un senior muy senior. Hay más de 1600 preguntas y una amplia gama de conocimientos. Además, este senior ha dado respuestas a cada pregunta por sí mismo. Si tiene preguntas o no Para entender una determinada pregunta, puede iniciar sesión en la computadora para copiar el tema y publicar un comentario para que todos lo discutan juntos. También puede seguirme y enviarme un mensaje privado después de iniciar sesión en la computadora. ¡Progresemos juntos!

Actividad

1. ¿Hablar sobre el ciclo de vida de la actividad?

En circunstancias normales, el ciclo de vida común de la actividad es solo los siguientes 7

  • onCreate(): indica que se está creando la actividad y, a menudo, se usa para inicializar el trabajo, como llamar a setContentView para cargar recursos de diseño de interfaz, inicializar los datos requeridos por la actividad, etc.;
  • onRestart (): indica que la actividad se está reiniciando. En circunstancias normales, se llamará a OnRestart cuando la actividad actual cambie de invisible a visible nuevamente;
  • onStart(): Indica que la Actividad se está iniciando. En este momento, la Actividad es visible pero no en primer plano. Todavía está en segundo plano y no puede interactuar con el usuario;
  • onResume(): Indica que la Actividad ha ganado el foco, y en este momento la Actividad está visible y en primer plano y comienza activa, que es la diferencia con onStart;
  • onPause (): indica que la actividad se está deteniendo. En este momento, puede realizar algunos trabajos, como almacenar datos y detener la animación, pero no debería llevar demasiado tiempo, ya que afectará la visualización de la nueva actividad. OnPause debe ejecutarse primero, y onResume de la nueva actividad no se implementará;
  • onStop(): indica que la actividad está a punto de detenerse, y puede realizar algunos trabajos pesados ​​de reciclaje, como cancelar el receptor de transmisión, cerrar la conexión de red, etc., y no debería llevar demasiado tiempo;
  • onDestroy(): indica que la actividad está a punto de ser destruida. Esta es la última devolución de llamada en el ciclo de vida de la actividad, a menudo haciendo trabajo de reciclaje y liberación de recursos;

2. ¿Qué métodos se llamarán cuando la actividad A inicie otra actividad B? ¿Qué sucede si B es un tema transparente o DialogActivity?

La actividad A inicia otra actividad B y la devolución de llamada es la siguiente:
onPause() de la actividad A → onCreate() de la actividad B → onStart() → onResume() → onStop() de la actividad A;
si B es un tema transparente o a DialogActivity, entonces el onStop de A no será devuelto;

3. Cuéntame sobre la función del método onSaveInstanceState() ¿Cuándo se llamará?

Condiciones de ocurrencia: en circunstancias anormales (la actividad se cancela y se vuelve a crear cuando cambia la configuración del sistema, la actividad de baja prioridad se cancela debido a una memoria de recursos insuficiente)

  • El sistema llamará a onSaveInstanceState para guardar el estado de la Actividad actual.Este método se llama antes de onStop y no tiene una relación de tiempo establecida con onPause;
  • Cuando se reconstruya la actividad, el sistema llamará a onRestoreInstanceState y pasará el objeto Bundle guardado por el método onSave (abreviatura) a onRestore (abreviatura) y onCreate() al mismo tiempo, por lo que estos dos métodos se pueden usar para determinar si el La actividad se ha reconstruido,
    llame después de onStart;

4. Háblame de los cuatro modos de inicio y escenarios de aplicación de Actividad.

Modo estándar estándar: cada vez que se inicia una actividad, se recreará una nueva instancia, independientemente de si la instancia ya existe
, la actividad en este modo ingresará a la pila de tareas de la actividad que la inició de forma predeterminada;
modo de multiplexación superior de la pila singleTop : si la nueva actividad ya está en la parte superior de la pila de tareas, la actividad no se volverá a crear y se volverá a llamar al método onNewIntent. Si la nueva instancia de actividad ya existe pero no está en la parte superior de la pila, la La actividad seguirá siendo recreada;

Modo de multiplexación en pila SingleTask: siempre que la actividad exista en una pila de tareas, la instancia no se volverá
a crear y se devolverá la llamada al método onNewIntent. En este modo, cuando se inicia la actividad A , el sistema primero buscará si hay una actividad que A desea Si la
pila de tareas no existe, se volverá a crear una pila de tareas y luego la instancia creada de A se colocará en la pila;
modo de instancia única singleInstance: Esto es un modo singleTask mejorado, y la actividad con este modo solo puede ubicarse por separado
en una pila de tareas, y solo hay una instancia en esta pila de tareas;

5. ¿Sabes qué banderas se usan comúnmente en las actividades?

  • FLAG_ACTIVITY_NEW_TASK : corresponde al modo de inicio singleTask, y su efecto es el mismo que especificar el modo de inicio en XML;
  • FLAG_ACTIVITY_SINGLE_TOP : corresponde al modo de inicio singleTop, y su efecto es el mismo que especificar el modo de inicio en XML;
  • FLAG_ACTIVITY_CLEAR_TOP: cuando se inicia una actividad con esta bandera, todas las actividades por encima de ella en la misma pila de tareas aparecerán. Este indicador suele aparecer junto con el modo singleTask, en este caso,
    si la instancia de la actividad iniciada ya existe, el sistema volverá a llamar a NewIntent. Si la actividad iniciada se
    inicia en modo estándar, esta y las actividades anteriores se eliminarán de la pila y el sistema creará una nueva instancia de actividad y la colocará en la pila;
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: Las actividades con esta bandera no aparecerán en la lista de actividades del historial
    ;

6. ¿Cómo iniciar la Actividad de otras aplicaciones?

En el caso de acceso garantizado, use el Intent implícito para hacer coincidir el IntentFilter de la Actividad de destino. El principio es: un intento
solo se puede iniciar si coincide con la acción, la categoría y los datos en el filtro de intentos de una Actividad en el al mismo tiempo Actividad:
una actividad puede tener varios filtros de intención, siempre que una intención coincida correctamente con cualquier conjunto de filtros de intención, la actividad puede iniciarse;

Fragmento de preguntas de la entrevista.

1. ¿Hablar sobre el ciclo de vida de Fragment?

Los métodos involucrados en el ciclo de vida completo de Fragment desde la creación hasta la destrucción son: onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView( )→onDestroy()→onDetach(), hay muchos métodos con el mismo nombre y función similar a Activity, pero los diferentes métodos
son:

  • onAttach(): Llamado cuando Fragmento y Actividad están asociados;
  • onCreateView(): llamado cuando el fragmento crea una vista, después de onCreate;
  • onActivityCreated(): se llama cuando la actividad asociada con el fragmento se completa onCreate();
  • onDestroyView (): se llama cuando se elimina el diseño en el Fragmento;
  • onDetach(): Llamado cuando el Fragmento y la Actividad están desasociados;

2. ¿Habla sobre la diferencia entre Actividad y Fragmento?

Similitudes: Ambos pueden contener diseños y tener su propio ciclo de vida.

diferencia:

  • En comparación con Activity, Fragment tiene 4 ciclos de devolución de llamada más, lo que es más flexible en la operación de control;
  • El fragmento puede escribirse directamente en el archivo XML o agregarse dinámicamente en la Actividad;
  • Fragmento puede usar show()/hide() o replace() para cambiar de Fragmento en cualquier momento, y no habrá ningún efecto obvio al cambiar, y la experiencia del usuario será mejor; aunque la Actividad también se puede cambiar, habrá algunos problemas al cambiar entre actividades El cambio de página obvio u otros efectos no les dan a los usuarios una buena sensación al cambiar una pequeña parte del contenido;

3. La diferencia entre agregar y reemplazar en Fragmento (Fragmento se superpone)

  • add no reinicializará el fragmento, replace lo hará cada vez. Entonces, si obtiene los datos en el ciclo de vida del fragmento, los obtendrá repetidamente si usa reemplazar;
  • Al agregar el mismo fragmento, no habrá cambios en replace, y add informará una IllegalStateException;
  • Reemplazar primero elimina todos los fragmentos con la misma identificación y luego agrega el fragmento actual, mientras que agregar sobrescribe el fragmento anterior. Entonces, si usa agregar, generalmente estará acompañado por hide() y show() para evitar la superposición del diseño;
  • Al usar agregar, si la aplicación se coloca en segundo plano o el sistema la destruye de otras maneras, cuando se abre nuevamente, el fragmento al que se hace referencia en hide() se
    destruirá o agregue uno cuando use el parámetro agregar etiqueta;

4. ¿Cuál es la diferencia entre getFragmentManager, getSupportFragmentManager y getChildFragmentManager?

  • Lo que obtiene getFragmentManager() es el administrador del contenedor principal del fragmento donde se encuentra, y lo que obtiene getChildFragmentManager() es el administrador del subcontenedor en el fragmento. Si el fragmento es un fragmento anidado, entonces debe utilice getChildFragmentManager();
  • Dado que Fragment es un componente que solo aparece en la versión 3.0 de la API del sistema Android, el sistema anterior a la 3.0 puede llamar directamente a getFragmentManager() para obtener el objeto FragmentManager(), mientras que el sistema anterior a la 3.0 necesita llamar a getSupportFragmentManager() para obtenerlo indirectamente;

5. La diferencia entre FragmentPagerAdapter y FragmentStatePagerAdapter y escenarios de uso

El mismo punto: ambos heredan PagerAdapter

La diferencia: cada fragmento de FragmentPagerAdapter se almacenará de forma persistente en FragmentManager y no se destruirá siempre que el usuario pueda volver a la página. Por lo tanto, es adecuado para páginas con datos relativamente estáticos y una pequeña cantidad de Fragmentos; FragmentStatePagerAdapter solo retiene la página actual, y cuando la página es invisible, el Fragmento se eliminará y se liberarán sus recursos. Por lo tanto, es adecuado para situaciones en las que los datos son más dinámicos, ocupan más memoria y tienen muchos fragmentos;

preguntas de la entrevista de servicio

1. ¿Hablar del ciclo de vida del Servicio?

  • onCreate(): si el servicio no se ha creado, la devolución de llamada onCreate() se ejecutará después de llamar a startService(); si el servicio ya se está
    ejecutando, llamar a startService() no ejecutará el método onCreate(). En otras palabras, onCreate() solo se creará por primera vez
  • Llamado durante el servicio, las ejecuciones múltiples de startService() no llamarán a onCreate() repetidamente, este método es adecuado para completar algunos trabajos de inicialización;
  • onStartCommand(): llamado cuando se inicia el servicio, este método es adecuado para completar algunas tareas de carga de datos, como crear un hilo aquí para descargar datos o reproducir música;
  • onBind(): Llamado cuando el servicio está enlazado;
  • onUnBind(): llamado cuando el servicio no está vinculado;
  • onDestroy(): llamado cuando el servicio se detiene;

2. ¿Dos formas de iniciar el Servicio? ¿Dónde está la diferencia?

Dos modos de inicio de Servicio:

  • startService(): al llamar a startService de esta manera, onCreate() solo se llamará una vez, y llamar a startServie varias veces
    ejecutará los métodos onStartCommand() y onStart() varias veces. Si no se llama externamente al método stopService() o stopSelf(),
    el servicio seguirá ejecutándose.
  • bindService(): si el servicio no se ha creado antes, la secuencia de devolución de llamada del sistema es onCreate()→onBind(). Si el servicio se ha enlazado antes de llamar al método bindService(), llamar al método bindService() varias veces no creará el servicio ni lo enlazará varias veces. Si la persona que llama desea desvincularse del servicio que se está vinculando, puede llamar al método unbindService() y la secuencia de devolución de llamada es onUnbind()→onDestroy();

3. ¿Cómo garantizar que el Servicio no se elimine?

  • En el método onStartCommand, devuelve START_STICKY o START_REDELIVER_INTENT

START_STICKY : si se devuelve START_STICKY, significa que después de que el sistema Android elimine por la fuerza el proceso en ejecución del Servicio, el sistema Android aún establecerá el Servicio en el estado iniciado (es decir, el estado en ejecución), pero ya no guarde el objeto de intención pasado por el método onStartCommand

START_NOT_STICKY : si se devuelve START_NOT_STICKY, significa que el Servicio no se volverá a crear después de que el sistema Android elimine por la fuerza el proceso en ejecución del Servicio.

START_REDELIVER_INTENT : si se devuelve START_REDELIVER_INTENT, su devolución es similar a START_STICKY, pero la diferencia es que el sistema conservará la intención que se pasó por última vez al método onStartCommand y luego la pasará nuevamente al método Service onStartCommand recreado.

  • Aumentar la prioridad del Servicio. En el archivo AndroidManifest.xml, el filtro de intenciones puede
    establecer la prioridad más alta a través del atributo android:priority = "1000", y el valor más alto es 1000. Si el número es más pequeño, la prioridad es más baja y también es adecuado para radiodifusión;
  • Reinicie el servicio en el método onDestroy Cuando el servicio llegue a onDestroy(), envíe una transmisión personalizada y
    reinicie el servicio cuando se reciba la transmisión;
  • Aumentar la prioridad del proceso de Servicio. Prioridad del proceso de mayor a menor: proceso en primer plano, proceso visual, proceso de servicio, proceso en segundo plano,
    proceso vacío puede usar startForeground para poner el servicio en primer plano, de modo que cuando la memoria es baja, la probabilidad de ser eliminado será menor;
    El estado del servicio de monitoreo de transmisión del sistema instala el APK en /system/app y lo convierte en una aplicación a nivel del sistema

4. ¿Se pueden habilitar operaciones que consumen mucho tiempo en el Servicio? ¿Cómo hacerlo?

El servicio no se ejecuta en un subproceso secundario de forma predeterminada, ni se ejecuta en un proceso independiente, también se ejecuta en el subproceso principal (subproceso de interfaz de usuario). En otras palabras, no realice operaciones que consumen mucho tiempo en el Servicio, a menos que se abra manualmente un subproceso secundario, de lo contrario, el subproceso principal puede bloquearse (ANR);

5. ¿Qué servicios del sistema ha utilizado?

alternativa

6. ¿Entiende ActivityManagerService? ¿Qué papel juega?

ActivityManagerService es el servicio principal de Android. Es principalmente responsable del inicio, la conmutación y la programación de los cuatro componentes principales del sistema y la gestión y programación de los procesos de la aplicación. Sus responsabilidades son similares a los módulos de gestión y programación de procesos en el sistema operativo. sistema;

Preguntas de la entrevista del CIP

1. ¿Cuál es la relación entre proceso e hilo en Android? ¿la diferencia?

  • Un subproceso es la unidad más pequeña de programación de CPU y un subproceso es un recurso limitado del sistema;
  • Un proceso generalmente se refiere a una unidad de ejecución, un programa o una aplicación en una PC y un dispositivo móvil,
  • En términos generales, un programa de aplicación tiene al menos un proceso, y un proceso tiene al menos un hilo (la relación entre contenido y contenido).En términos generales, hay un proceso en la fábrica de aplicaciones, y el hilo es la línea de producción interna, pero el hilo principal Solo hay uno (línea de producción principal), pero puede haber múltiples hilos secundarios (líneas de producción secundarias).
  • Un proceso tiene su propio espacio de direcciones independiente y los subprocesos del proceso comparten este espacio de direcciones y pueden ejecutarse simultáneamente.

2. ¿Cómo habilitar el multiproceso? ¿Puede una aplicación abrir N procesos?

  • Especifique el atributo android:process para los cuatro componentes principales en AndroidMenifest para habilitar el modo multiproceso
  • Se pueden abrir N procesos bajo la condición de que la memoria lo permita

3. ¿Por qué se necesita IPC? ¿Qué problemas pueden surgir en la comunicación multiproceso?

  • Los cuatro componentes principales (Actividad, Servicio, Receptor, Proveedor de contenido) que se ejecutan en diferentes procesos
    no podrán compartir datos Esto se debe a que Android asigna una máquina virtual independiente para cada aplicación y las diferentes máquinas virtuales tienen asignaciones de memoria diferentes. dará como resultado múltiples copias de objetos de la misma clase a los que se accede en diferentes máquinas virtuales. Por ejemplo, ejemplos comunes (obtener más espacio de memoria al habilitar múltiples procesos, compartir datos entre dos o más aplicaciones, WeChat Family Bucket)
  • En términos generales, el uso de la comunicación multiproceso causará los siguientes problemas

1) Los miembros estáticos y los patrones singleton son completamente inválidos: las máquinas virtuales independientes causan

2) El mecanismo de sincronización de hilos es completamente efectivo: las máquinas virtuales independientes causan

3) La confiabilidad de SharedPreferences disminuye: esto se debe a que Sp no admite dos procesos para leer y escribir al mismo tiempo, lo que puede provocar la pérdida de datos.

4) La aplicación se creará varias veces: el sistema Android asignará una máquina virtual independiente al crear un nuevo proceso, por lo que este proceso es en realidad el proceso de iniciar una aplicación y, naturalmente, se creará una nueva aplicación.

4. ¿Cuál es la función y el principio del mecanismo Binder?

El sistema Linux divide un proceso en espacio de usuario y espacio de kernel. Para los procesos, los datos en el espacio del usuario no se pueden compartir, pero los datos en el espacio del kernel sí se pueden compartir. Para garantizar la seguridad y la independencia, un proceso no puede operar directamente ni acceder a otro proceso, es decir, los procesos de Android son independientes y están aislados de entre sí. , lo que requiere un método de comunicación de datos entre procesos.

Un proceso completo de comunicación de Binder IPC suele ser así:

  • Primero, el controlador Binder crea un búfer de recepción de datos en el espacio del kernel;
  • Luego abra un área de búfer del kernel en el espacio del kernel, establezca la relación de mapeo entre el área del búfer del kernel y el área del búfer de recepción de datos en el kernel, y la relación de mapeo entre el área del búfer de recepción de datos en el kernel y la dirección del espacio de usuario de el proceso de recepción;
  • El proceso emisor copia los datos en el búfer del kernel en el kernel a través de la llamada del sistema copyfromuser() Dado que existe una asignación de memoria entre el búfer del kernel y el espacio de usuario del proceso receptor, es equivalente a enviar los datos al usuario espacio del proceso de recepción Se completa una comunicación entre procesos.

5. ¿Por qué es necesario serializar el objeto de transferencia de paquete? ¿Cuál es la diferencia entre Serialzable y Parcelable?

  • Debido a que el paquete solo admite tipos de datos básicos al transferir datos, debe serializarse y convertirse en un
    estado esencial almacenable o transferible (flujo de bytes) al transferir objetos. Los objetos serializados se pueden
    transferir entre redes, IPC (como Actividad, Servicio y Receptor que inician otro proceso) y también se pueden almacenar localmente.
  • Dos formas de implementación de la serialización: implementar la interfaz Serializable/Parcelable. La diferencia se muestra en la figura:

alternativa

6. Háblame de AIDL? ¿Cuál es el principio? ¿Cómo optimizar la situación en la que múltiples módulos usan AIDL?

  • AIDL (Lenguaje de definición de interfaz de Android, Lenguaje de definición de interfaz de Android): si desea llamar al método de un objeto en otro proceso en un proceso, puede usar AIDL para generar parámetros serializables, y AIDL generará una clase de proxy para el objeto del servidor , a través de su cliente, implementa métodos que llaman indirectamente a objetos del lado del servidor.

  • La esencia de AIDL es que el sistema proporciona un conjunto de herramientas que pueden implementar rápidamente Binder. Clases y métodos clave:

1) Interfaz AIDL: heredar IInterface.

2) Clase Stub: la clase de implementación de Binder, a través de la cual el servidor proporciona servicios.

3) Clase de proxy: el proxy local del servidor, a través del cual el cliente llama al método del servidor.

4) asInterface(): Llamado por el cliente para convertir el objeto Binder devuelto por el servidor en el objeto de tipo interfaz AIDL requerido por el cliente. Si el cliente y el servidor están en el mismo proceso, devuelva el objeto Stub directamente; de ​​lo contrario, devuelva el objeto Stub.proxy encapsulado por el sistema.

5) asBinder(): Devuelve el objeto Binder del proxy Proxy según la situación actual de la llamada.

6) onTransact(): en el grupo de subprocesos de Binder que ejecuta el servidor, cuando el cliente inicia una solicitud de proceso cruzado, la solicitud remota será encapsulada por la capa inferior del sistema y entregada a este método para su procesamiento.

7) transact(): se ejecuta en el cliente y suspende el hilo actual cuando el cliente inicia una solicitud remota. Después de eso, se llama a onTransact() del servidor hasta que regresa la solicitud remota y el subproceso actual continúa ejecutándose.

  • Cuando múltiples módulos comerciales requieren AIDL para realizar IPC, se debe crear un archivo aidl específico para cada módulo y habrá
    muchos servicios correspondientes. Inevitablemente habrá un gran consumo de recursos del sistema y un exceso de aplicaciones pesadas. La solución es establecer un
    grupo de conexiones de Binder, es decir, reenviar uniformemente las solicitudes de Binder de cada módulo comercial a un Servicio remoto para su ejecución, evitando así la creación repetida de
    Servicios.
  • Principio de funcionamiento: cada módulo comercial crea su propia interfaz AIDL e implementa esta interfaz, y luego proporciona su propio identificador único y su objeto Binder correspondiente al servidor. El servidor solo necesita un Servicio, y el servidor proporciona una interfaz queryBinder, que devolverá el objeto Binder correspondiente de acuerdo con las características del módulo comercial.Después de que diferentes módulos comerciales obtengan el objeto Binder requerido, pueden llamar al método remoto

ver preguntas de la entrevista

1. Cuéntame sobre el proceso de dibujo de View.

  • El flujo de trabajo de View se refiere principalmente a los tres procesos principales de medida, diseño y dibujo, a saber, medición, diseño y dibujo. La medida determina el ancho/alto medido de View, y el diseño determina el ancho/alto final de View y las posiciones de los cuatro vértices draw dibuja la vista en la pantalla

  • El proceso de dibujo de View sigue los siguientes pasos:

1) Dibuja el fondo background.draw (lienzo)

2) Dibújate a ti mismo (onDraw)

3) Dibujar niños (dispatchDraw)

4) Dibujar decoraciones

2. ¿Qué es MotionEvent? ¿Cuántos eventos están incluidos? ¿Bajo qué condiciones ocurrirá?

  • MotionEvent es una serie de eventos generados después de que el dedo toque la pantalla. Los tipos de eventos típicos son los siguientes:
    1) ACTION_DOWN: el dedo acaba de tocar la pantalla

2) ACTION_MOVE: el dedo se mueve en la pantalla

3) ACTION_UP: el momento en que se suelta el dedo de la pantalla

4) ACTION_CANCELL: se activa cuando el dedo sigue presionando y se mueve del control actual al control externo

  • En circunstancias normales, un dedo que toque la pantalla desencadenará una serie de eventos de clic. Considere las siguientes situaciones:

1) Suelte después de hacer clic en la pantalla, secuencia de eventos: ABAJO→ARRIBA

2) Haga clic en la pantalla para deslizar por un momento y luego suelte, la secuencia de eventos es ABAJO→MOVER→…→MOVER→ARRIBA

3. Describa el mecanismo de entrega y distribución de eventos View.

  • La esencia de la distribución de eventos View es el proceso de distribución de eventos MotionEvent. Es decir, cuando ocurre un evento de movimiento, el sistema pasa el
    evento de clic a una vista específica.
  • El orden de entrega de eventos de clic: Actividad (Ventana) → ViewGroup → View
  • El proceso de distribución de eventos se completa mediante tres métodos:

1) dispatchTouchEvent: se utiliza para distribuir eventos. Si el evento se puede entregar a la vista actual, entonces definitivamente se llamará a este método y el resultado devuelto se verá afectado por onTouchEvent de la vista actual y el método dispatchTouchEvent de la vista subordinada, lo que indica si se debe consumir el evento actual.

2) onInterceptTouchEvent: llamado dentro del método anterior para interceptar el evento. Este método solo está disponible en ViewGroup, View (sin incluir ViewGroup) no lo está. Una vez interceptado, se ejecuta onTouchEvent de ViewGroup y el evento se procesa en ViewGroup en lugar de distribuirse a View. Y solo llamado una vez, el resultado devuelto indica si interceptar el evento actual

3) onTouchEvent: llamado en el método dispatchTouchEvent para procesar el evento de clic, y el resultado devuelto indica si consumir el evento actual

4. ¿Cómo resolver el conflicto de eventos de Vista? Dé un ejemplo encontrado en el desarrollo?

  • Los conflictos de eventos comunes en el desarrollo incluyen el conflicto deslizante entre ScrollView y RecyclerView, y las diapositivas integradas de RecyclerView en la misma dirección al mismo tiempo.
  • Reglas de manejo para conflictos deslizantes:

1) Para conflictos de deslizamiento causados ​​por inconsistencias entre las direcciones de deslizamiento externo e interno, es posible juzgar quién interceptará el evento según la dirección de deslizamiento.

2) Para los conflictos de deslizamiento causados ​​por la misma dirección de deslizamiento externa y dirección de deslizamiento interna, puede especificar cuándo permitir que la Vista externa intercepte eventos y cuándo permitir que la Vista interna intercepte eventos de acuerdo con los requisitos comerciales.

3) Para la anidación de los dos casos anteriores, es relativamente complicado, y también se puede encontrar un punto de avance en el negocio según las necesidades.

  • El método de implementación del conflicto deslizante:

1) Método de intercepción externa: significa que el evento de clic primero es interceptado por el contenedor principal, si el contenedor principal necesita este evento, será interceptado; de lo contrario, no será interceptado. Método específico: debe volver a escribir el método onInterceptTouchEvent del contenedor principal y realizar las intercepciones correspondientes internamente.

2) Método de intercepción interna: el contenedor principal no intercepta ningún evento, pero pasa todos los eventos al contenedor secundario. Si el contenedor secundario necesita este evento, lo consumirá directamente, de lo contrario, será procesado por el contenedor principal. Método específico: necesita cooperar con el método requestDisallowInterceptTouchEvent.

5. ¿Cuál es la diferencia entre scrollTo() y scollBy()?

  • scollBy llama internamente a scrollTo, que es una diapositiva relativa basada en la posición actual; mientras que scrollTo es una diapositiva absoluta, por lo que si el método scrollTo se llama varias veces con
    el mismo entrada, la Vista solo aparecerá una vez porque la posición inicial de la La vista permanece sin cambios efecto de desplazamiento
  • Ambos solo pueden deslizar el contenido de la Vista, no la Vista en sí. Puede usar Scroller para tener un efecto de deslizamiento excesivo

6. ¿Cómo realiza el Scroller el deslizamiento elástico de la Vista?

  • Llame al método startScroll() cuando se activa el evento MotionEvent.ACTION_UP. Este método no realiza la operación de deslizamiento real, pero registra la cantidad relacionada con el deslizamiento (distancia de deslizamiento, tiempo de deslizamiento)
  • Luego llame al método invalidate/postInvalidate() para solicitar que View se vuelva a dibujar, lo que hace que se ejecute el método View.draw
  • Cuando se vuelve a dibujar la Vista, se llamará al método computeScroll en el método draw, y computeScroll irá al Scroller para obtener el scrollX y scrollY actual; luego use el método scrollTo para realizar el deslizamiento; luego llame al método postInvalidate para realizar el segundo redibujado y el proceso anterior De manera similar, tales repeticiones hacen que la Vista se deslice continuamente en un rango pequeño, y múltiples deslizamientos pequeños forman un deslizamiento elástico hasta que finaliza todo el proceso de deslizamiento.

7. ¿Cuál es la diferencia entre invalidate() y postInvalidate()?

Tanto invalidate() como postInvalidate() se usan para actualizar la Vista. La principal diferencia es que invalidate() se llama en el subproceso principal. Si se usa en un subproceso, se requiere un controlador; mientras que postInvalidate()
puede llamarse directamente en un subproceso.

8. ¿Cuál es la diferencia entre SurfaceView y View?

  • La vista necesita actualizar la pantalla en el subproceso de la interfaz de usuario, mientras que SurfaceView puede actualizar la página en el subproceso
  • View es adecuado para actualizaciones activas, mientras que SurfaceView es adecuado para actualizaciones pasivas, como actualizaciones frecuentes. Esto se debe a que las actualizaciones frecuentes con View bloquearán el hilo principal y harán que la interfaz se congele.
  • SurfaceView ha implementado un mecanismo de doble búfer en la capa inferior, pero View no lo hace, por lo que SurfaceView es más adecuado para páginas que requieren una actualización frecuente y una gran cantidad de procesamiento de datos durante la actualización (como la interfaz de reproducción de video)

9. ¿Cómo personalizar View para considerar la adaptación del modelo?

  • Uso razonable de warp_content, match_parent
  • Utilice RelativeLayout siempre que sea posible
  • Para diferentes modelos, use diferentes archivos de diseño y colóquelos en el directorio correspondiente, y Android los emparejará automáticamente.
  • Usar unidades de píxeles independientes de la densidad dp, sp
  • Introduce el diseño porcentual de Android.
  • Al cortar una imagen, corte una imagen con una resolución grande y aplíquela al diseño. También tendrá un buen efecto de visualización en teléfonos móviles con resoluciones pequeñas.

Reponer:

Debido al espacio, no puedo mostrar más contenido. Todo el contenido se ha organizado en un folleto de entrevistas, que incluye estructura de datos y algoritmo, fundamentos de Java, anotaciones y genéricos detallados, programación concurrente, principio de máquina virtual, clase de reflexión, programación de red, Kotlin, interfaz de usuario avanzada, código fuente del núcleo del marco, núcleo de componentes, optimización del rendimiento, marco de código abierto, etc. El siguiente código QR se puede obtener directamente.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Androiddddd/article/details/131792542
Recomendado
Clasificación