0Pricing
Android Academy · Lección

WorkManager y tareas en segundo plano

Programe trabajo garantizado en segundo plano con WorkManager. Use OneTimeWorkRequest, PeriodicWorkRequest, restricciones, transferencia de datos y encadenamiento de trabajos.

WorkManager y tareas en segundo plano es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 5 de 6. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 6 lecciones en total.

Trabajo en segundo plano en Android

Android restringe de forma estricta el trabajo en segundo plano para ahorrar batería. Antes de WorkManager, los desarrolladores utilizaban:

  • AsyncTask (obsoleto)
  • AlarmManager (no es fiable tras reinicios o durante Doze)
  • JobScheduler (API compleja)
  • Services (pueden cerrarse y no permiten reintentos)

WorkManager es la solución recomendada para trabajos en segundo plano aplazables y garantizados.

¿Qué es WorkManager?

WorkManager garantiza que el trabajo se ejecute incluso si la aplicación se cierra o el dispositivo se reinicia. Sus características:

  • Conserva el trabajo tras los reinicios
  • Reintenta automáticamente si se produce un error
  • Admite restricciones, como usar solo WiFi o ejecutarse solo durante la carga
  • Funciona en API 14+
  • Se integra con Kotlin Coroutines mediante CoroutineWorker

Configuración

Añada WorkManager a app/build.gradle:

dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.9.0'
}

Crear un Worker

Extienda CoroutineWorker e implemente doWork(). Devuelva Result.success(), Result.failure() o Result.retry():

class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // This runs on a background coroutine
            val repo = UserRepository(applicationContext)
            repo.syncFromNetwork()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry()
            else Result.failure()
        }
    }
}

OneTimeWorkRequest

Programe una tarea única y póngala en cola:

val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(10, TimeUnit.MINUTES)  // optional delay
    .build()

WorkManager.getInstance(context).enqueue(syncWork)

// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
    "sync_work",
    ExistingWorkPolicy.KEEP,   // don't enqueue if already pending
    syncWork
)

PeriodicWorkRequest

Programe tareas repetitivas. El intervalo mínimo es de 15 minutos:

val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
    repeatInterval = 1, TimeUnit.HOURS
).build()

WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "hourly_sync",
    ExistingPeriodicWorkPolicy.KEEP,
    periodicSync
)

Restricciones

Ejecute el trabajo solo cuando se cumplan determinadas condiciones, como que la batería no esté baja o haya conexión WiFi:

val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)  // WiFi only
    .setRequiresBatteryNotLow(true)
    .setRequiresCharging(false)
    .build()

val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(constraints)
    .build()

WorkManager.getInstance(context).enqueue(work)

Datos de entrada y salida

Pase datos a un Worker y recíbalos de él mediante objetos Data:

// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInputData(inputData)
    .build()

// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
    override suspend fun doWork(): Result {
        val userId = inputData.getInt("user_id", -1)

        // Pass output data back:
        val output = workDataOf("synced_count" to 10)
        return Result.success(output)
    }
}

Observar el estado del trabajo

Observe el progreso del trabajo mediante getWorkInfoByIdLiveData:

val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)

WorkManager.getInstance(this)
    .getWorkInfoByIdLiveData(workRequest.id)
    .observe(this) { info ->
        when (info?.state) {
            WorkInfo.State.RUNNING   -> binding.tvStatus.text = "Syncing..."
            WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
            WorkInfo.State.FAILED    -> binding.tvStatus.text = "Failed"
            else                     -> {}
        }
    }

Encadenar trabajos

Ejecute tareas de forma secuencial o en paralelo mediante cadenas de trabajo:

val downloadWork  = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork   = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork    = OneTimeWorkRequestBuilder<UploadWorker>().build()

// Sequential: download → process → upload
WorkManager.getInstance(context)
    .beginWith(downloadWork)
    .then(processWork)
    .then(uploadWork)
    .enqueue()

// Parallel then merge:
WorkManager.getInstance(context)
    .beginWith(listOf(downloadWork, processWork))  // both run in parallel
    .then(uploadWork)                              // runs after both finish
    .enqueue()

WorkManager frente a las alternativas

Cuándo usar cada opción:

  • WorkManager — trabajo aplazable, garantizado y basado en restricciones. Es ideal para sincronizaciones, cargas y tareas de limpieza.
  • Coroutines / ViewModel — trabajo vinculado a que la aplicación esté abierta. Se detiene cuando la aplicación se cierra.
  • AlarmManager — alarmas para momentos exactos, como recordatorios del calendario. Requiere gestionar cuidadosamente la batería.
  • Foreground Service — tareas de larga duración de las que el usuario es consciente, como reproducir música o utilizar la navegación.

Comprobación rápida

¿Cuál es el intervalo mínimo de repetición de un PeriodicWorkRequest?

Repaso: WorkManager

WorkManager es la herramienta adecuada para trabajos garantizados en segundo plano:

  • Extender CoroutineWorker e implementar doWork()
  • Devolver Result.success(), .failure() o .retry()
  • Usar OneTimeWorkRequest para ejecuciones únicas y PeriodicWorkRequest para tareas recurrentes
  • Añadir Constraints para usar solo WiFi, establecer condiciones de batería, etc.
  • Pasar datos con workDataOf()
  • Encadenar tareas con beginWith().then().enqueue()

A continuación: componentes de Material Design para crear interfaces atractivas.

Preguntas frecuentes

¿La lección «WorkManager y tareas en segundo plano» es gratis?

Sí — el texto completo de «WorkManager y tareas en segundo plano» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 6 lecciones en total.

¿Qué aprenderé en «WorkManager y tareas en segundo plano»?

Programe trabajo garantizado en segundo plano con WorkManager. Use OneTimeWorkRequest, PeriodicWorkRequest, restricciones, transferencia de datos y encadenamiento de trabajos. Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 5 de 6.

¿Cuánto tiempo toma la lección «WorkManager y tareas en segundo plano»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Retrofit y API REST
  2. Carga de imágenes con Coil
  3. Gestión de errores y UX
  4. Notificaciones push
  5. WorkManager y tareas en segundo plano
  6. Publicación en Play Store
← Volver a Android Academy