Tutorial de introducción a Android | Servicio de los cuatro componentes (servicio en primer plano, servicio en segundo plano)

inserte la descripción de la imagen aquí

Un Servicio es un componente de la aplicación que realiza operaciones de larga duración en segundo plano sin proporcionar una interfaz de usuario. Los servicios pueden ser iniciados por otros componentes de la aplicación y continuarán ejecutándose en segundo plano incluso si el usuario cambia a otra aplicación.

Además, los componentes pueden interactuar con los servicios vinculándose a ellos e incluso realizar comunicación entre procesos (IPC). Por ejemplo, un servicio puede manejar transacciones de red en segundo plano, reproducir música, realizar E/S de archivos o interactuar con proveedores de contenido.

Recepción

El servicio de escritorio realiza algunas operaciones que el usuario puede notar. Por ejemplo, una aplicación de audio utiliza un servicio de primer plano para reproducir pistas de audio. Un servicio en primer plano debe mostrar una notificación. Los servicios en primer plano continúan ejecutándose incluso si el usuario deja de interactuar con la aplicación.

Iniciar el servicio en primer plano

El servicio de primer plano puede proporcionar a los usuarios operaciones en la interfaz. Cada servicio en primer plano debe mostrar una notificación en la barra de notificaciones. El usuario puede percibir que el servicio en primer plano de la aplicación se está ejecutando. Esta notificación no se puede eliminar de forma predeterminada. Una vez que se detenga el servicio, el sistema eliminará la notificación. Cuando el usuario no necesita operar directamente la aplicación y la aplicación necesita mostrarle una pantalla de estado, se puede utilizar el servicio en primer plano.

Inicie el servicio en la actividad y llame startForegroundService(Intent)al método.

startForegroundService(Intent(applicationContext, ForegroundService1::class.java))

Luego, en el servicio, debe utilizar el método correspondiente startForeground.

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    
    
        Log.d(TAG, "onStartCommand flags:$flags, startId:$startId [$this] ${Thread.currentThread()}")

        val pendingIntent: PendingIntent =
                Intent(this, ForegroundDemoAct::class.java).let {
    
     notificationIntent ->
                    PendingIntent.getActivity(this, 0, notificationIntent, 0)
                }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    
    
            val chanId = "f-channel"
            val chan = NotificationChannel(chanId, "前台服务channel",
                    NotificationManager.IMPORTANCE_NONE)
            chan.lightColor = Color.BLUE
            chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
            val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            service.createNotificationChannel(chan)
            Log.d(TAG, "服务调用startForeground")

            val notification: Notification =
                    Notification.Builder(applicationContext, chanId)
                            .setContentTitle("RustFisher前台服务")
                            .setContentText("https://an.rustfisher.com")
                            .setSmallIcon(R.drawable.f_zan_1)
                            .setContentIntent(pendingIntent)
                            .build()
            startForeground(1, notification)
        } else {
    
    
            Log.d(TAG, "${Build.VERSION.SDK_INT} < O(API 26) ")
        }
        return super.onStartCommand(intent, flags, startId)
    }` 

Veamos este código en servicio. Creó uno simple Notification.

  • PendingIntent se asignará a Notificación como una acción de salto después de hacer clic en la notificación
  • Utilice NotificationManager para crear un NotificationChannel primero
  • Utilice Notification.Builder para configurar y crear una notificación, como configurar título, texto de contenido, icono, etc.
  • Inicie el servicio de primer plano y llame startForeground(1, notification)al método.

Se mostrará una notificación en el dispositivo. Al hacer clic en esta notificación, se saltará a ForegroundDemoAct. Esto se configuró previamente con PendingIntent.

Fuera de servicio

se puede utilizar stopServicepara detener el servicio

stopService(Intent(applicationContext, ForegroundService1::class.java))

De esta forma, el Servicio sale y toma onDestroyel método.

detener el servicio en primer plano

stopForeground(boolean)Llamar al método en el Servicio puede detener el primer plano, pero no sale de todo el servicio. Este booleano indica si se cancela la notificación del servicio en primer plano. falso significa mantener las notificaciones.

Por ejemplo, llamar al servicio

stopForeground(false)

El servicio se convirtió en un servicio en segundo plano y no salió. En este momento se puede cancelar la notificación correspondiente deslizando.

mensaje de error

ANR

El servicio de inicio se llama en la Actividad startForegroundService(Intent), pero no se llama Service.startForeground(). El registro de ejecución de Android10 del teléfono móvil OnePlus 5 es el siguiente

2021-08-26 23:03:25.352 25551-25551/com.rustfisher.tutorial2020 D/rustAppUseStartService: 调用 startForegroundService 主线程信息Thread[main,5,main]
2021-08-26 23:03:25.368 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onCreate Thread[main,5,main] rustfisher.com
2021-08-26 23:03:25.370 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onStartCommand flags:0, startId:1 [com.rustfisher.tutorial2020.service.foreground.ForegroundService1@c77d408] Thread[main,5,main]
2021-08-26 23:03:35.375 1596-1720/? W/ActivityManager: Bringing down service while still waiting for start foreground: ServiceRecord{
    
    53d70f2 u0 com.rustfisher.tutorial2020/.service.foreground.ForegroundService1}
2021-08-26 23:03:35.382 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onDestroy [com.rustfisher.tutorial2020.service.foreground.ForegroundService1@c77d408] Thread[main,5,main]

2021-08-26 23:03:52.956 1596-1720/? E/ActivityManager: ANR in com.rustfisher.tutorial2020
    PID: 25551
    Reason: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{
    
    53d70f2 u0 com.rustfisher.tutorial2020/.service.foreground.ForegroundService1}` 

Mala notificación

Lo agregamos en el método de ForegroundService1 . Si se pasa la identificación de 0, se informará un error .onStartCommandstartForegroundstartForeground(0, noti)RemoteServiceException

29871-29871/com.rustfisher.tutorial2020 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.rustfisher.tutorial2020, PID: 29871
    android.app.RemoteServiceException: Bad notification for startForeground

Servicios de fondo

Los servicios en segundo plano realizan operaciones que el usuario no nota directamente. Por ejemplo, si una aplicación utiliza un servicio para compactar su almacenamiento, ese servicio suele ser un servicio en segundo plano.

  • El servicio/Servicio en este artículo se refiere al servicio en segundo plano.
  • Los ejemplos se implementan utilizando Kotlin.

nuevo servicio

Creamos una nueva clase ServiceStartDemo heredando el Servicio

class ServiceStartDemo : Service() {
    
    

    companion object {
    
    
        const val TAG = "rustAppStartDemoService"
    }

    override fun onCreate() {
    
    
        super.onCreate()
        Log.d(TAG, "onCreate ${Thread.currentThread()}")
    }

    override fun onBind(intent: Intent): IBinder? {
    
    
        Log.d(TAG, "onBind ${Thread.currentThread()}")
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    
    
        Log.d(TAG, "onStartCommand flags:$flags, startId:$startId [$this] ${Thread.currentThread()}")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
    
    
        super.onDestroy()
        Log.d(TAG, "onDestroy [$this] ${Thread.currentThread()}")
    }
}
  • En cada método de ciclo de vida, marcamos el registro para la observación de seguimiento.
  • Imprima la información detallada del objeto de servicio, información del hilo, etc. en el registro.
  • En el método onBind, devolvemos nulo, lo que indica que bindService no puede iniciar el servicio.

Registre este servicio en AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
  <!-- ... -->
  <application>
    <service
        android:name=".service.start.ServiceStartDemo"
        android:enabled="true"
        android:exported="false" />
            <!-- ... -->
  </application>
</manifest>

Aviso

  • name es el nombre de clase de nuestro servicio. es el único atributo requerido
  • enable es verdadero, lo que indica que el sistema puede crear una instancia de este servicio. El valor por defecto es verdadero
  • La aplicación también tiene su propia propiedad habilitada, el valor predeterminado es verdadero. Esta propiedad se aplica a todos los componentes de la aplicación, incluidos los servicios.
  • Exportado se establece en falso aquí, lo que indica que no lo utilizan otros procesos (aplicaciones) y solo se aplica a nuestra aplicación para que nuestro servicio esté listo.

startService iniciar servicio

Llame al método startService en la actividad para iniciar el servicio.

startService(Intent(applicationContext, ServiceStartDemo::class.java))

Después de llamar al método, se iniciará el servicio ServiceStartDemo. Cuando se inicia por primera vez, el servicio pasará por los métodos onCreate y onStartCommand. El código de naturaleza de inicialización se coloca en onCreate.

Si el servicio ya existe, use el método startService para iniciar el servicio y el servicio usará el método onStartCommand. En este momento, el startId en onStartCommand aumentará automáticamente. Utilice este valor para ver cuántas veces se ha iniciado el objeto Servicio.

Al mismo tiempo, podemos observar en el registro del Servicio que la función del ciclo de vida del Servicio se ejecuta en el hilo principal. Por lo tanto, el Servicio también puede encontrar problemas de ANR. No coloque tareas que consuman mucho tiempo en funciones del ciclo de vida.

La actividad se comunica con el servicio.

Actividad y Servicio son componentes independientes. El uso startServicedel método para iniciar el servicio no hace que la actividad contenga una instancia del servicio. Pueden utilizar la radiodifusión para comunicarse entre sí. O utilice herramientas como EventBus para comunicarse.

Fuera de servicio

Una vez realizada la tarea, podemos detener el servicio. Ahorre recursos del sistema. El frente es startServiceel servicio iniciado por el método y el último stopService(Intent)se utiliza para detener el servicio.

método introducir
detenerservicio(intención) La actividad u otros componentes llaman a este método para detener el servicio de destino.
detenerse a sí mismo() El servicio llama a este método para detenerse

Por ejemplo en Actividad

stopService(Intent(applicationContext, ServiceStartDemo::class.java))

en servicio

stopSelf()

Una vez que se realiza una solicitud para detener el servicio usando stopSelf()o , el servicio irá en sentido contrario. El sistema destruirá el servicio lo antes posible.stopService()onDestroy()

Servicio de encuadernación

bindService()Un servicio está vinculado cuando un componente de la aplicación se vincula a él mediante una llamada .

Los servicios vinculados proporcionan una interfaz cliente- servidor para que los componentes interactúen con el servicio, envíen solicitudes, reciban resultados e incluso realicen estas operaciones entre procesos utilizando la comunicación entre procesos (IPC). Los servicios vinculados solo se ejecutan cuando están vinculados a otro componente de la aplicación. Se pueden vincular varios componentes al servicio al mismo tiempo, pero cuando todos se desvinculan, el servicio se destruye.

Preguntas de la entrevista relacionadas con el servicio

1. ¿Qué es el Servicio?

El servicio es uno de los cuatro componentes principales de Android y puede realizar operaciones de larga duración en segundo plano sin componentes de aplicación de la interfaz de usuario.

Hay dos formas de iniciar el servicio: iniciar startService y iniciar bindService.

Nota: Los servicios, al igual que otros objetos de aplicación, se ejecutan en el hilo principal de su proceso de alojamiento. Esto significa que si su servicio desea realizar cualquier operación que requiera un uso intensivo de la CPU (como la reproducción de MP3) o de bloqueo (como la red), debe crear otro subproceso secundario en el Servicio, y luego estará bien procesar las operaciones que consumen mucho tiempo. aquí.

2. A qué prestar atención al registrar un Servicio

El servicio aún se ejecuta en el subproceso principal, por lo que si necesita realizar algunas operaciones lógicas complejas, es mejor crear subprocesos manualmente dentro del servicio para su procesamiento; de lo contrario, el subproceso de la interfaz de usuario se bloqueará.

3. Cómo comunicarse entre Servicio y Actividad

método uno:

  • Agregue una clase interna que herede Binder y agregue los métodos lógicos correspondientes
  • Vuelva a escribir el método onBind de Servicio y devuelva la instancia de clase interna que acabamos de definir
  • Reescriba ServiceConnection, cuando onServiceConnected llame al método lógico para vincular el servicio

Método dos

  • Llamar al método de Servicio a través de la interfaz Iservice, usar la interfaz para llamar al servicio y llamar al servicio directamente son en realidad lo mismo en esencia, pero hay un paso adicional de excusa.

4. La diferencia entre IntentService y Service (ventajas de intentservice)

IntentService es una subclase de Servicio. Es un servicio asincrónico que se detendrá automáticamente. Resuelve el problema de olvidar detener y destruir el Servicio después de procesar operaciones que consumen mucho tiempo en el Servicio tradicional.

  • Se creará un hilo de trabajo independiente para manejar todas las solicitudes de intención;
  • Se creará un subproceso de trabajo independiente para procesar el código implementado por el método onHandleIntent() sin tener que lidiar con problemas de subprocesos múltiples;
  • Una vez procesadas todas las solicitudes, IntentService se detendrá automáticamente sin llamar al método stopSelf() para detener el Servicio;
  • Proporcione una implementación predeterminada para onBind() del Servicio y devuelva nulo;
  • Proporcionar una implementación predeterminada para onStartCommand del Servicio para agregar la intención de solicitud a la cola;
  • IntentService no bloqueará el hilo de la interfaz de usuario, mientras que el Serveice normal provocará una excepción ANR
  • Si Intentservice no ha completado la tarea anterior, no abrirá un nuevo hilo, esperará a que se complete la tarea anterior antes de ejecutar la nueva tarea y luego llamará a stopSelf() nuevamente una vez completada la tarea.

5. ¿Se ejecuta el Servicio en el hilo principal? ¿Se pueden realizar operaciones que requieren mucho tiempo en el servicio?

De forma predeterminada, si no se muestra, se refiere al proceso en ejecución del servicio. El servicio y la actividad se ejecutan en el hilo principal (hilo principal de la interfaz de usuario) del proceso donde se encuentra la aplicación actual.

Las operaciones que requieren mucho tiempo (solicitudes de red, copia de bases de datos , archivos grandes) no se pueden realizar en el servicio

En casos especiales, puede configurar el proceso donde se ejecuta el servicio en el archivo de manifiesto, para que el servicio pueda ejecutarse en otro proceso.

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" >
</service>

6. Ciclo de vida del servicio

El servicio tiene modo vinculante y modo no vinculante, así como el uso mixto de estos dos modos. Los diferentes métodos de uso tienen diferentes métodos de ciclo de vida.

  • Modo no vinculante: cuando se llama a startService por primera vez, los métodos ejecutados son onCreate () y onStartCommand () a su vez, y el método onDestory se llama cuando se cierra el Servicio.
  • Modo de enlace: cuando se ejecuta el primer bindService(), onCreate() y onBind() se ejecutarán cuando el enlace esté desvinculado, y se ejecutará onUnbind() y onDestory().

Los dos ciclos de vida anteriores se encuentran en modo relativamente simple. También debemos prestar atención durante el proceso de desarrollo a que solo habrá una instancia de Servicio, es decir, si el Servicio a iniciar ya existe, el Servicio no se volverá a crear y por supuesto no se creará el método onCreate(). llamado.

Un servicio puede estar vinculado por varios clientes, solo se ejecutan todos los objetos vinculados

El Servicio se destruirá después de ejecutar el método onBind(), pero si un cliente ejecuta el método onStart(), si todos los clientes vinculados ejecutan unBind() en este momento, el Servicio no se destruirá.

El diagrama del ciclo de vida del Servicio se muestra a continuación para ayudarle a recordar.

Utilice startService únicamente para iniciar el ciclo de vida del servicio.

imagen

Utilice BindService únicamente para vincular el ciclo de vida del servicio.

imagen

Al mismo tiempo, use startService () para iniciar el servicio y BindService () para vincular el ciclo de vida del servicio.

imagen

7. ¿Cuál es la relación entre Actividad, Intención y Servicio?

Son las clases más utilizadas en el desarrollo de Android. Entre ellos, Actividad y Servicio son uno de los cuatro componentes principales de Android. Ambas son subclases de ContextWrapper, una subclase de la clase Context, por lo que pueden considerarse hermanos. Sin embargo, cada uno de los dos hermanos tiene sus propias habilidades: la actividad es responsable de la visualización e interacción de la interfaz de usuario y el servicio es responsable del procesamiento de las tareas en segundo plano. Los datos se pueden pasar entre Actividad y Servicio a través de Intent, por lo que Intent puede considerarse como un mensajero de comunicación.

8. ¿Están Servicio y Actividad en el mismo hilo?

Para la misma aplicación, está en el mismo hilo de forma predeterminada, el hilo principal (hilo UI).

9. ¿Cómo aumentar la prioridad del servicio?

  • En AndroidManifest.xmlel archivo, puede android:priority = “1000”establecer la prioridad más alta para el filtro de intención a través de este atributo, 1000 es el valor más alto, si el número es menor, la prioridad es menor y es práctico para la transmisión.
  • Llame al método en onStartCommand startForeground()para actualizar el Servicio al nivel de proceso de primer plano y luego recuerde llamar stopForeground ()al método en onDestroy.
  • El método onStartCommand devuelve manualmente START_STICKY.
  • Envíe una transmisión para reiniciar el servicio en el método onDestroy. El método de servicio + transmisión es enviar una transmisión personalizada cuando el servicio pasa a la historia y reiniciar el servicio cuando se recibe la transmisión. (Cuando la aplicación de terceros o la detención forzada de la aplicación de configuración, el proceso de la APLICACIÓN se cerrará directamente y el método onDestroy no podrá ingresar, por lo que no hay garantía de que se ejecute)
  • Supervise la transmisión del sistema para juzgar el estado del Servicio. A través de algunas transmisiones del sistema, como: reinicio del teléfono móvil, activación de la interfaz, cambio de estado de la aplicación, etc., monitoree y capture, y luego juzgue si nuestro Servicio aún está activo.
  • Aplicación más el atributo Persistente.

10. ¿Cuántos valores de retorno tiene el método de Servicio onStartCommand?¿Qué significan?

Hay cuatro valores de retorno:

  • **START_STICKY: **Si se finaliza el proceso de servicio, el estado del servicio se mantiene como estado de inicio, pero el objeto de intención entregado no se conserva. Luego, el sistema intentará recrear el servicio. Dado que el estado del servicio es el estado de inicio, se llamará al método onStartCommand (Intent, int, int) después de que se cree el servicio. Si no se pasaron comandos de inicio al servicio durante este tiempo, el parámetro Intent será nulo.
  • START_NOT_STICKY: "No pegajoso". Al utilizar este valor de retorno, si el servicio se cierra de forma anormal después de ejecutar onStartCommand, el sistema no reiniciará automáticamente el servicio.
  • **START_REDELIVER_INTENT:** Intención de retransmisión. Al utilizar este valor de retorno, si el servicio se cierra de forma anormal después de ejecutar onStartCommand, el sistema reiniciará automáticamente el servicio y pasará el valor de Intent.
  • START_STICKY_COMPATIBILITY: la versión compatible de START_STICKY, pero no garantiza que el servicio se reiniciará después de ser eliminado.

11. ¿Cuáles son las formas en que la Actividad llama a los métodos en el Servicio?

  • Binder: se implementa en forma de interfaz Binder. Cuando la Actividad vincula el Servicio con éxito, la Actividad obtendrá la subclase Binder devuelta por el método onBind () del Servicio en el método de devolución de llamada onServiceConnected () de la clase ServiceConnection y luego llamará. a través del método del objeto.
  • Aidl: Aidl es más adecuado para escenarios donde el cliente y el servidor no están en la misma aplicación.
  • Messenger: hace referencia a un objeto Handler para que otros puedan enviarle mensajes (utilizando el método mMessenger.send(Message msg)). Esta clase permite la comunicación basada en mensajes entre procesos (es decir, dos procesos pueden comunicarse a través de mensajes), y se crea un Messenger usando un controlador en el lado del servidor, y el cliente puede comunicarse con el servidor después de mantener este Messenger. Un Messeger no puede enviar en ambas direcciones al mismo tiempo, dos Messeger pueden enviar en ambas direcciones

imagen

12. La diferencia entre Servicio e Hilo

El servicio es un componente del sistema en Android, se ejecuta en el hilo principal de un proceso independiente y no puede realizar operaciones que requieran mucho tiempo. El subproceso es la unidad más pequeña de ejecución del programa, la unidad básica de asignación de CPU y puede iniciar subprocesos para realizar operaciones que requieren mucho tiempo. El Servicio puede obtener su propia instancia en diferentes Actividades y es conveniente operar el Servicio. Es difícil para Thread obtener su propia instancia en diferentes Actividades, si la Actividad se destruye, es difícil volver a obtener la instancia de Thread.

13. Usando IntentService

IntentService es una subclase de Scrvice, por lo que no es un Servicio ordinario, agrega funciones adicionales que el Servicio ordinario.

Primero veamos los dos problemas del Servicio en sí.

  • El Servicio no inicia específicamente un proceso separado, el Servicio y su aplicación se encuentran en el mismo proceso.
  • El servicio no es un hilo nuevo, por lo que las tareas que consumen mucho tiempo no deben procesarse directamente en el servicio.

IntentService simplemente compensa la falta de Servicio.

Características de IntentService:

  • IntentService creará un hilo de trabajo separado para manejar todas las solicitudes de Intent.
  • IntentService creará un hilo de trabajo separado para procesar el código implementado por el método onHandleIntent(), para que los desarrolladores no tengan que lidiar con problemas de subprocesos múltiples.

Instancia de IntentService

  1. Cree SccIntentService.java heredado de la clase IntentService, reescriba el método onHandleIntent () y cree un constructor sin argumentos. El código es el siguiente:
public class SccIntentService extends IntentService {
    
    
 public SccIntentService() {
    
    
 super("SccIntentService");
 }
 @Override
 protected void onHandleIntent(Intent intent) {
    
    
 MLog.e(getClass().getName(), "onHandleWork");
 for (int i = 0; i < 3; i++) {
    
    
 try {
    
    
 MLog.e(getClass().getName(), "Number:开始"+i);
 Thread.sleep(10000);
 MLog.e(getClass().getName(), "Number:结束"+i);
 } catch (InterruptedException e) {
    
    
 e.printStackTrace();
 }
 }
 }
 @Override
 public void onDestroy() {
    
    
 super.onDestroy();
 MLog.e(getClass().getName(), "onDestroy");
 }
}

\ 2. Agregue la declaración del componente IntentService y declare un componente de servicio en el archivo AndroidManifest.xml. El código es el siguiente:

<service android:name=".service.SccIntentService"/>

\ 3. Inicie SccIntentService

startService(new Intent(ServiceActivity.this, SccIntentService.class));</pre>

\ 4. Resultado de ejecución

07-07 18:00:39.505 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: onHandleWork
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始0
07-07 18:01:22.691 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束0
07-07 18:01:22.697 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始2
07-07 18:01:42.699 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束2
07-07 18:01:42.716 E/-SCC-com.scc.demo.service.SccIntentService: onDestroy

El servicio ordinario ejecuta directamente operaciones que consumen mucho tiempo durante 20 segundos, lo que bloqueará el hilo principal y provocará una excepción ANR (el programa no responde).

IntentService realiza operaciones que consumen mucho tiempo durante 30 segundos sin bloquear el hilo principal, y mucho menos generar ANR. Como se muestra en la figura anterior, comienza desde 18:01:12>18:01:42 durante 30 segundos y no se genera ANR durante el funcionamiento normal.

Otra ventaja de IntentService es "desaparecer después de su uso". Después de ejecutar las operaciones que consumen mucho tiempo en el método onHandleIntent(), llame al método onDestroy() para cerrarlo.

¡Se puede obtener información más completa, desde el ingreso de base cero hasta el dominio de Android, de forma gratuita escaneando el código QR! ! !

[Equipo técnico de Tencent producido] Entrada a la competencia de base cero de Android, tutorial de instalación de Android Studio + un conjunto completo de tutoriales básicos de Android

Tutorial de programación de Android

Conceptos básicos del lenguaje Java desde la entrada hasta la familiaridad

inserte la descripción de la imagen aquí

Conceptos básicos del lenguaje Kotlin desde la entrada hasta la familiaridad

inserte la descripción de la imagen aquí

Pila de tecnología Android desde la entrada hasta la familiaridad

inserte la descripción de la imagen aquí

Aprendizaje integral del depósito familiar Android Jetpack

inserte la descripción de la imagen aquí

Para los principiantes, puede resultar difícil instalar Android Studio. Puede ver el siguiente video y aprender a instalarlo y ejecutarlo paso a paso.

Tutorial de instalación de Android Studio

inserte la descripción de la imagen aquí

Con el aprendizaje de la etapa de Java, se recomienda centrarse en el aprendizaje en video en esta etapa y complementarlo con libros para verificar si hay omisiones. Si se centra en los libros, puede escribir códigos basados ​​en explicaciones de libros, complementados con vídeos didácticos para comprobar si hay omisiones. Si tiene problemas, puede ir a Baidu. Generalmente, muchas personas encontrarán problemas al comenzar y darán mejores respuestas.

Es necesario dominar puntos de conocimiento básicos, como cómo utilizar los cuatro componentes principales, cómo crear un Servicio, cómo diseñar, una Vista personalizada simple, animación, comunicación de red y otras tecnologías comunes.

Se ha preparado un conjunto completo de tutoriales de base cero para usted; si lo necesita, puede agregar el código QR a continuación para obtenerlo gratis

Un conjunto completo de tutoriales básicos de Android.

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Android23333/article/details/132423453
Recomendado
Clasificación