es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La mejor manera de restablecer el PendingIntent en segundo plano después de un reinicio en Android 2021.

Estoy construyendo una aplicación de recordatorios. Y cuando reinicio el dispositivo, las alarmas que ya han sido establecidas como “pending intent” en el gestor de alarmas son destruidas. Así que cuando reinicio:

  1. Despierto el broadcastReceiver
  2. El broadcastReceiver llama a una actividad
  3. Esta actividad establece el pending intent nuevamente.

Funcionó bien. Sin embargo, utilicé una actividad, por lo que esta actividad aparece en pantalla un segundo después del reinicio. Eso no es realmente bueno. Así que quiero hacer que esto funcione en segundo plano.

Entonces, me di cuenta de que puedo usar IntentService.
Sin embargo, IntentService está en desuso en el nivel de API 30.
También JobIntentService está en desuso.

Estoy muy confundido. ¿Qué debo usar para hacer que esto funcione en segundo plano?
Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    A partir del nivel de API 30, el enfoque recomendado para ejecutar tareas en segundo plano es utilizar la API WorkManager. WorkManager gestiona tareas que deben retrasarse o ejecutarse periódicamente, y maneja automáticamente la conectividad de red, la optimización de la batería y otras limitaciones del sistema.

    Para usar WorkManager, debes definir una clase Worker que extienda androidx.work.Worker e implemente el trabajo real que deseas ejecutar. Luego, puedes crear una PeriodicWorkRequest para programar el worker para que se ejecute periódicamente en segundo plano.

    Aquí tienes un ejemplo de código para que puedas comenzar:

    class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    
        override fun doWork(): Result {
            // Implementa tu tarea en segundo plano aquí
            val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(applicationContext, MyBroadcastReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT)
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent)
            return Result.success()
        }
    }
    
    val workRequest = PeriodicWorkRequestBuilder<myworker>(1, TimeUnit.DAYS)
        .build()
    WorkManager.getInstance(context).enqueue(workRequest)
    

    Este código programa una clase MyWorker para que se ejecute periódicamente una vez al día, y establece una alarma en el AlarmManager. Ten en cuenta que solo debes establecer alarmas que sean necesarias para que tu aplicación funcione correctamente, y no de forma excesiva.

    WorkManager proporciona mucha flexibilidad para programar y ejecutar tareas en segundo plano, y recomiendo leer la documentación para obtener más información.

Comments are closed.