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:
- Se inicia con
startForegroundService(). - 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 lanzarForegroundServiceDidNotStartInTimeException. - Se detiene con
stopSelf()ostopService()desde otro componente, o de forma forzada por el usuario a través de la notificación. Al detenerse, es necesario llamar astopForeground(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()
}