Todo lo que necesitas saber sobre cómo agregar notificaciones con Alarm Manager en Android | de Naman Garg | septiembre 2022

Foto de Daria Nepriakhina 🇺🇦 en UnsplashAndroid tiene una función que te permite programar notificaciones para más tarde. Esto es útil si los usuarios/desarrolladores necesitan hacer algo más tarde. Por ejemplo, si desea que se le recuerde al usuario una tarea que estableció en una futura aplicación de lista de tareas. Este blog usa AlarmManager y Broadcast Receiver para lograr lo mismo en Android API Nivel 26 o superior.

Nota → No utilizaremos la API de WorkManager para programar alertas, ya que las alertas son un caso de uso especial y no forman parte del trabajo en segundo plano. AlarmManager también es la forma recomendada de ejecutar trabajos con precisión de tiempo.

Paso 1: configurar la clase de datos:Debido a que usé esta clase de datos con RoomDatabase, se anota con Entity, pero no es necesaria de otra manera. Pero lo principal es el campo ID, que es una clave principal y se usará más adelante para configurar varias notificaciones a la vez.Paso 2. Configure la clase BroadcastReceiver:Nuestro AlarmManager llamará a esta clase en algún momento en el futuro y esta clase activará la notificación en ese momento. Necesitamos agregar la notificación dentro de esta clase. Algunas cosas importantes a tener en cuenta al agregar una notificación son:

  1. setContentIntent() = Necesita una intención pendiente que se activará cuando un usuario toque la notificación. PendingIntent necesita cuatro parámetros aquí, a saber, Contexto, RequestCode, Intent y Flag. Asegúrese de agregar una de las banderas como FLAG_IMMUTABLE, ya que las API más recientes lo requieren.
  2. setAutoCancel() = Determina si la notificación desaparecerá o no cuando el usuario la toque.
  3. tapResultIntent.flags = Asegúrate de agregar el indicador de intención como quieras. Uso FLAG_ACTIVITY_SINGLE_TOP porque esta aplicación usa un modelo de fragmentos múltiples de actividad única y, en cualquier caso, solo MainActivity existe en la parte superior de la pila y cuando un usuario toca la notificación mientras la aplicación está en primer plano, no se crean nuevas instancias de la actividad.
  4. NotificationCompat.Builder() = El contexto y la identificación del canal se usan como parámetros y debemos asegurarnos de que la identificación del canal sea la misma que la identificación del canal que usaremos más adelante para crear el canal de notificación.

Esta clase aquí obtiene el objeto taskInfo como intención de mostrar la descripción de la notificación como taskInfo.description y realizar algunas tareas más tarde cuando agregamos un botón de acción a la notificación. Además, no olvide agregar esta clase en el archivo de manifiesto.Paso 3: Configure la alarmaUsaremos el método setAlarmClock() para configurar una alarma, ya que descubrí que es el más confiable en el futuro al configurar varias alarmas. Hay varios métodos para configurar una alarma, como

  1. ajustado a()
  2. establecerExacto()
  3. setInExactRepeating()
  4. establecerRepetir()
  5. Establece el tiempo()
  6. establecerZonaHora()
  7. establecer y permitir mientras está inactivo ()
  8. setExactAndAllowWhileIdle()
  9. establecerVentana()

En la función setAlarm(taskInfo: TaskInfo), primero creamos una instancia del administrador de alarmas y luego establecemos una intención pendiente para abrir la clase AlarmReciver en el futuro, que luego activa la notificación. Tenga en cuenta que usamos taskInfo.id como RequestCode, lo que garantiza que tengamos un RequestCode diferente para cada alerta y, por lo tanto, podamos crear múltiples alertas con múltiples notificaciones.Algunas cosas sobre setAlarmClock() –Con este método, el ícono de alarma aparece en la barra de estado del usuario como si hubiera configurado una alarma usando la aplicación de alarma integrada de su dispositivo, y cuando el usuario abre completamente su notificación, ve la hora de la alarma. Tocar la hora de la alarma en la notificación activa el PendingIntent que especificamos en el objeto AlarmClockInfo, que aquí es basicPendingIntent. Al configurar cualquier alarma exacta, debemos agregar el permiso SCHEDULE_EXACT_ALARM en el archivo de manifiesto para las API más recientes.Paso 4: crea el canal de notificaciónA partir de Android 8.0 (nivel de API 26), todas las notificaciones deben asignarse a un canal. Por ejemplo, aquí podemos crear tres canales para diferentes tareas prioritarias establecidas por los usuarios, tales como: B. bajo, medio y alto, cada uno con diferente imagen y sonido. NotificationChannel requiere 3 parámetros (channel_id, channel_name, prioridad). channel_id debe ser diferente para cada canal y channel_name debe describir información básica sobre el canal que el usuario puede ver en la información de la aplicación. Solo necesita configurarse una vez y puede llamarse dentro del método onCreate().Paso 5: Cancelar la alarma (Opcional)Imaginemos que tenemos una alarma programada para una tarea que el usuario quiere hacer, pero resulta que el usuario la ha hecho mucho antes. En tal caso tenemos que apagar la alarma. Es muy fácil cancelar la alarma, pero debe asegurarse de que el PendingIntent utilizado para cancelarla debe coincidir con el PendingIntent que usamos para configurar la alarma; de lo contrario, no se cancelará. No es necesario pegar el mismo contenido en la intención utilizada anteriormente, ya que el contenido dentro de la intención no coincide al comparar las intenciones pendientes. (por ejemplo, intención.putExtra)Paso 6: agregue alarmas al reiniciar el dispositivoDe forma predeterminada, cuando un dispositivo se apaga, todas las alarmas se cancelan. Para evitar esto, debemos diseñar nuestra aplicación para restablecer automáticamente la alarma cuando el usuario reinicia el dispositivo. Esto asegura que AlarmManager continúe funcionando sin que el usuario tenga que reiniciar la alarma. Necesitamos agregar una clase de receptor de transmisión que recibirá una transmisión cada vez que se reinicie el dispositivo. Aquí obtenemos la lista de todas las alarmas activas usando nuestro repositorio y volvemos a poner las alarmas en esta clase. Además, debemos agregar el permiso RECEIVE_BOOT_COMPLETED en el archivo de manifiesto de Android junto con la clase RebootBroadcastReceiver y sus filtros de intención. Estos filtros de intención permiten recibir la transmisión cuando el dispositivo se reinicia o se enciende.

Nota: para los teléfonos móviles más nuevos, debe activar manualmente la función de inicio automático en Información de la aplicación → Administración de la batería → Inicio automático para que reciba la transmisión RECEIVE_BOOT_COMPLETED. Inicialmente está apagado por motivos de gestión de la batería. Básicamente, permite que su aplicación se inicie automáticamente cuando recibe la transmisión.

Paso 7Agregar botón de acción (opcional)Digamos que un usuario recibe la notificación de una tarea y la completó. En este caso, el usuario quiere hacer clic en el botón «Finalizar/Completado» para que pueda eliminarse de la cola de tareas incompletas. Ahora agreguemos un botón de acción para completar una tarea. Aquí no abriremos una actividad cuando el usuario toque el botón, pero haremos algo de trabajo en segundo plano. Para hacer esto, necesitamos agregar algo de código a la clase AlarmReceiver que creamos anteriormente y agregar otra clase de receptor de transmisión que recibirá la transmisión para realizar una acción cuando se complete una tarea. Dentro de la clase AlarmReceiver, debemos agregar otra intención pendiente que sea responsable de abrir la clase OnCompletedBroadcastReceiver. Esta clase recibe el objeto taskInfo cuando el usuario toca el botón de acción y cambia su estado a verdadero cuando la tarea se completa y la actualiza en el espacio de la base de datos con el repositorio. Agregue también esta clase en el archivo AndroidManifest.xml.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.