Acumulación | Entrevista de Android: El servicio de Android más simple, ¿realmente puedes responderlo?

Autor: nanchen2251

¿Qué importancia tiene el servicio?

Vi una escena así en el artículo sobre "Lan Liu Xue". Fue muy interesante. Permítanme compartir con ustedes primero. Echemos un vistazo a lo problemático que es ignorar el Servicio.

Escenario: si una aplicación desea descargar un archivo de Internet y mostrar una barra de progreso en la actividad, la actividad requiere que se pueda girar la pantalla. Entonces Actvitiy se reiniciará cuando se cambie la pantalla. ¿Cómo asegurarse de que la barra de progreso de descarga pueda mostrar correctamente el progreso?

Las personas que no conocen el servicio suelen idear un plan de este tipo.

    1. El progreso se almacena en caché antes de que se cambie la pantalla y luego se lee en voz alta después de que se cambia la pantalla.
    1. Use la android:configChangesconfiguración, de modo que cuando el interruptor no muestre la destrucción y reconstrucción de la actividad.

Con respecto al primer esquema, de hecho, existen muchas lagunas en el pensamiento cuidadoso. En primer lugar, durante el proceso de cambio de pantalla, sabemos que la reconstrucción de la actividad lleva relativamente tiempo y puede llevar varios cientos de milisegundos o más. En este momento, el hilo de descarga sigue funcionando y el progreso debe ser inconsistente con el progreso durante el guardado Cómo lidiar con esto ¿Cuál es el problema?

Para la segunda solución, puede comenzar a pensar en ello usted mismo. En proyectos reales, es posible que deba hacer algunas cosas adicionales para lidiar con el diseño horizontal y vertical de ContentView.

Si usa el Servicio, ¿qué buena idea tiene? Puede que desee darlo en el área de comentarios.

Debes haber oído hablar de Service. ¿De cuántas formas empieza?

El servicio es una clase que se especializa en realizar operaciones a largo plazo en segundo plano y no interactúa con la interfaz de usuario del usuario. Proporciona dos métodos de inicio.

  • inició
    otras llamadas de componentes startService()Iniciar un servicio. Una vez iniciado, el Servicio siempre se ejecutará en segundo plano, incluso si el componente que inició el Servicio se ha destruido. Por lo general, un servicio iniciado realizará una operación separada en segundo plano y no es necesario devolver resultados al componente que lo inició. Solo cuando el Servicio para llamar a sus propios stopSelf()u otros componentes de la llamada se stopService()dará por terminado.
  • enlazar
    otros componentes se puede llamar bindService()para enlazar un servicio. De esta manera, el Servicio quedará vinculado al componente que lo inició, cuando se destruya el componente que lo inició, el Servicio realizará automáticamente la operación de desvinculación. El mismo Servicio puede estar vinculado por varios componentes. Solo cuando todos los componentes vinculados hayan realizado la operación de desvinculación, el Servicio será destruido.

Por supuesto, el servicio también se puede ejecutar en los dos modos anteriores al mismo tiempo. Esto implica la ejecución de los dos métodos de devolución de llamada del Servicio: onStartCommand()(el método de devolución de llamada cuando se inicia un Servicio mediante el método de inicio), onBind()(el método para iniciar una devolución de llamada de Servicio mediante el método de vinculación).

Independientemente de la forma de iniciar el Servicio (iniciar, vincular, iniciar y vincular), cualquier componente (incluso otros componentes de la aplicación) puede utilizar el Servicio. Y pasar los parámetros a través de Intent. Por supuesto, también puede Servicio AndroidMenifest.xmlconfigurado para archivos privados, no permite el acceso de otras aplicaciones.

La android:exportedpropiedad se establece en false, lo que significa que no permite que otras aplicaciones inicien el ensamblaje de la presente aplicación, incluso la intención explícita no funciona (incluso cuando se usa una intención explícita) . Esto evita que otras aplicaciones inicien su componente de servicio.

Ciclo de vida del servicio

Cuando se trata de componentes, siempre nos gusta estudiar su ciclo de vida, y en este momento definitivamente es mejor usar diagramas para mostrarlos.

Estos dos caminos no son ajenos. Al llamar startService()al inicio de un Servicio, aún puede vincularse a este Servicio. Por ejemplo: al reproducir música, debe llamar al startService()inicio de la música especificada, cuando necesite obtener el progreso de la reproducción de la música, cuando necesite llamar bindService(), en este caso, a menos que el Servicio se desvincule, haya tenido que llamar stopService()y stopSelf()no haya podido detener el Servicio.

Estos métodos de ciclo de vida no necesitan llamar a sus métodos principales cuando se utilizan.

Ambas rutas de ciclo de vida pueden contener dos ciclos de vida anidados:

  • El ciclo de vida completo (toda la vida): desde la onCreate()llamada hasta el onDestroy()regreso. Actividad y similares, generalmente onCreate()hacen algún método de trabajo de inicialización, onDestroy()hacen algo de trabajo para liberar recursos. Por ejemplo, si el Servicio para reproducir una música de fondo, debe onCreate()abrir un hilo para iniciar la música y el método onDestroy()termina el hilo.

  • Ciclo de vida de la actividad (vida útil de la actividad): desde onStartCommand()o onBind()para iniciar una devolución de llamada, correspondiente a startService()o bindService()llamada. El enfoque de actividades que inician el ciclo de vida significaría el final de una prueba completa del final del ciclo, y uniría el camino, cuando onUnbind()regrese, el final del ciclo de vida de la actividad del Servicio.

Es de destacar que, ya startService()sea ​​que bindService()inicie el Servicio, onCreate()y onDestroy()será llamado nuevamente.

¿Puede Service's onCreate () realizar operaciones que consumen mucho tiempo?

El servicio se ejecuta en el subproceso principal, no es un subproceso nuevo, ni es un proceso nuevo, por lo que no puede realizar operaciones que consuman mucho tiempo.

¿Qué sucede si desea realizar operaciones que consumen mucho tiempo en Service?

Creo que casi todo el mundo puede pensar en usar Thread, de hecho lo hacemos a menudo. Necesita realizar operaciones que consumen mucho tiempo en el hilo principal, nada más que abrir un hilo y luego una operación caótica. Por supuesto, también puede utilizar AysncTasko HandlerThreadsustituir Thread para crear hilos.

Por supuesto que no hay problema, ¿hay otras formas más interesantes?

Sí, por supuesto, IntentService es una buena opción.

IntentService complejo

IntentServiceEn sucesión Service, si el Servicio no necesita procesar varias solicitudes al mismo tiempo, el uso IntentServiceserá la mejor opción. Solo necesita anular el onHandleIntent()método de Intent para recibir un parámetro de devolución de llamada, puede ser una operación que lleve mucho tiempo en el método, porque está habilitado de forma predeterminada un subproceso, después de completar la implementación de la operación no es necesario para llamar manualmente al stopSelf()método onHandleIntent(), llamará automáticamente al método.

Los puntos principales del uso de IntentService son los siguientes:

  • Volver al procesamiento predeterminado en el onStartCommand()método de subproceso de Intención;
  • En el onHandleIntent()método de intención de cola ordenada por tiempo del proceso de reescritura , así que no se preocupe por los subprocesos múltiples (subprocesos múltiples).
  • Cuando se completa todo el procesamiento de la solicitud, el servicio de parada automática, sin stopSelf()método de llamada manual ;
  • La implementación predeterminada del onBind()método y devuelve nulo;
  • La implementación predeterminada del onStartCommand()método y el retorno de Intent enviado en forma de secuencia onHandleIntent(), y solo necesita anular este método para tratar con Intent.

resumen

Cuando conocemos el propósito del Servicio y tenemos un concepto relacionado con el Servicio en mente, aún necesitamos hacer un análisis específico para el escenario real antes de decidir si usar el Servicio. Debido a que el servicio todavía se llama en el hilo principal, todavía es necesario abrir hilos para manejar el trabajo a largo plazo. La interacción entre el servicio y la interfaz de usuario también hace que este método no sea tan conveniente. Si solo necesita realizar algunas operaciones que requieren mucho tiempo en la interfaz actual, y el trabajo debe detenerse cuando la interfaz sale o cambia, entonces el uso directo de Thread (o AsyncTask, ThreadHandler) es más adecuado para usted.

Notas de revisión de la entrevista:

Esta información se publicará en varios blogs y foros a partir de la contratación de primavera. Recopile las preguntas de entrevistas intermedias y avanzadas de alta calidad para el desarrollo de Android en el sitio web y luego encuentre la mejor solución para toda la red. Cada pregunta de la entrevista es 100% preguntas reales + mejores respuestas. Conocimiento del paquete + muchos detalles.
Ahorre el tiempo de todos para buscar información en Internet para aprender, y también puede compartir con amigos a su alrededor para aprender juntos.
Deja un pulgar hacia arriba para el artículo y podrás recibirlo gratis ~

Me empuje para obtener: Android en línea guía de entrevista brutalidad , súper duro Android notas de conocimiento de la entrevista , 3000 páginas de notas conocimientos básicos para arquitectos de desarrolladores de Android

"Colección de entrevistas de desarrollo de Android de 1307 páginas"

Incluyendo a Tencent, Baidu, Xiaomi, Ali, LeTV, Meituan, 58, Cheetah, 360, Sina, Sohu y otras importantes empresas de Internet entrevistadas preguntas. La familiaridad con los puntos de conocimiento enumerados en este artículo aumentará en gran medida las posibilidades de aprobar las dos primeras rondas de entrevistas técnicas.

"507 páginas de análisis de código fuente relacionado con el desarrollo de Android"

Siempre que sea un programador, ya sea Java o Android, si no lee el código fuente y solo mira la documentación de la API, permanecerá en la piel. Esto no es bueno para el establecimiento y la integridad de nuestro sistema de conocimiento y la mejora de la tecnología de combate actual.

El que realmente puede ejercitar la mayor capacidad es leer el código fuente directamente, no solo leyendo el código fuente de los principales sistemas, sino también incluyendo una variedad de excelentes bibliotecas de código abierto.

La información se ha subido a mi GitHub.

Fin de frase

Escuché que todos los amigos a los que les gustó y siguieron fueron entrevistados con éxito. Si este blog es útil para usted, apoye al editor.

Preguntas seleccionadas de la entrevista avanzada de Android, Portal de documentos prácticos avanzados de Architect: Mi GitHub

Toda la escritura es fácil, los amigos que se sientan útiles pueden ayudar, compartir y apoyar al editor ~

Su apoyo, mi motivación, ¡les deseo a todos un futuro brillante y ofertas constantes! ! !

Supongo que te gusta

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