Sobes.tech
Middle

¿Qué es un servicio en segundo plano (servicio en primer plano) en Android?

sobes.tech AI

Respuesta de la IA

El servicio en primer plano (foreground service) es un tipo de servicio en Android que tiene una prioridad elevada y es visible para el usuario. Realiza tareas que son perceptibles para el usuario y no deben ser interrumpidas para ahorrar batería o memoria.

Características clave:

  • Muestra una notificación constante en la barra de notificaciones. El usuario debe poder ver que el servicio está en ejecución y potencialmente interactuar con él.
  • El sistema tiene menos probabilidades de terminar un servicio en primer plano en comparación con un servicio en segundo plano o un hilo, debido a su alta prioridad.
  • Requiere permiso especial FOREGROUND_SERVICE.
  • Se usa para tareas como reproducción de música, seguimiento de ubicación, sincronización de datos en tiempo real.

Ciclo de vida:

  1. Se inicia con startForegroundService().
  2. Dentro de los 5 segundos, es necesario llamar a startForeground(notificationId, notification) para poner el servicio en primer plano. De lo contrario, el sistema puede detener el servicio y lanzar ForegroundServiceDidNotStartInTimeException.
  3. Se detiene con stopSelf() o stopService() desde otro componente, o de forma forzada por el usuario a través de la notificación. Al detenerse, es necesario llamar a stopForeground(bool removeNotification) para eliminar la notificación.

Ejemplo de inicio:

// Obtener permiso
ActivityCompat.requestPermissions(
    this,
    arrayOf(Manifest.permission.FOREGROUND_SERVICE),
    REQUEST_CODE_FOREGROUND_SERVICE
)

// En el callback después de obtener el permiso o si ya se tiene
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)

Dentro del servicio:

// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    val notification: Notification = createNotification() // Método para crear la notificación
    startForeground(NOTIFICATION_ID, notification)
    // Aquí comienza la tarea del servicio
    return START_STICKY // O otra bandera adecuada
}

override fun onDestroy() {
    stopForeground(true) // Eliminar la notificación al detenerse
    // Limpieza de recursos
    super.onDestroy()
}