¿Cómo detectar que se hizo clic en un paquete / grupo de notificaciones en Android?

8

En Android Nougat y versiones posteriores, las notificaciones push para su aplicación se agrupan automáticamente después del # 4to.

El problema en Android es que al hacer clic en el paquete no se expande la lista de notificaciones push, se abre la aplicación.

Tengo un requisito para identificar a los usuarios que abrieron la aplicación a través de una notificación push. Para notificaciones individuales, esto es fácil ya que puedo explorar intentos adicionales. El problema con el paquete es que los extras son nulos y la intención se ve exactamente igual que si el usuario hiciera clic en el icono del iniciador. No tengo forma de detectar que la navegación se realizó desde una notificación push :(

En caso de que no esté claro: no estoy usando grupos de notificaciones push explícitamente, esto lo hace automáticamente Android. No he configurado ninguna clave de grupo para las notificaciones.

Estoy usando Firebase. Solo construyo la notificación push NotificationCompatcuando la aplicación está en primer plano, esta lógica no se ejecuta cuando la aplicación está en segundo plano o cerrada ( OnMessageReceivedsolo se ejecuta con la aplicación en primer plano).

EDITAR

Sé que podría cambiar la carga útil de PN para el evento que OnMessageReceivedse ejecuta incluso en segundo plano o cerrado. Me gustaría evitar esto, ya que he encontrado muchas personas quejándose de problemas con PN que no llegan en este caso.

http://github.com/firebase/quickstart-android/issues/368

http://github.com/firebase/quickstart-android/issues/219

Quiero detectar a un usuario tocando una PN agrupada incluso si la aplicación no la creó.

StackOverflower
fuente
AFAIK, tocando el icono de chevron del paquete debería expandir / contraer la lista de notificaciones.
Edric
@Edric: eso es correcto ... pero no puedo obligar al usuario a hacer eso. Algunos usuarios harán clic en la notificación push contraída y quiero manejar esa situación.
StackOverflower
Por notificaciones generadas del lado del servidor y no del lado del cliente, quiere decir que está utilizando FCM, ¿verdad? Incluso en ese caso, todavía estás usando developer.android.com/reference/android/app/… , ¿verdad? ¿Podría compartir algún fragmento de código?
Arnab Saha
@ArnabSaha: No puedo porque mi código para crear la notificación no se ejecuta cuando la aplicación está en segundo plano o cerrada
Claudio Redi
¿Sabes de antemano cuándo se agrupan las notificaciones?
Natig Babayev

Respuestas:

4

Solución 1: si maneja la creación de las notificaciones, puede intentar los siguientes pasos:

En primer lugar, cada vez que crea una nueva notificación, puede agruparlos por la misma clave usando setGroup(...):

val newMessageNotification1 = NotificationCompat.Builder(applicationContext, ...)
    ...
    .setGroup("group_messages")
    .build()

A medida que agrupa las notificaciones por la misma identificación ("group_messages") , ahora puede crear notificaciones de resumen con diferentes propósitos:

val notifyIntent = Intent(this, ResultActivity::class.java).apply {
val notifyIntent = Intent(this, ResultActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val notifyPendingIntent = PendingIntent.getActivity(
    this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT
)

val summaryNotification = NotificationCompat.Builder(applicationContext, ...)
    .setSmallIcon(android.R.drawable.ic_btn_speak_now)
    .setContentIntent(notifyPendingIntent)
    .setContentTitle("Grouped notification title")
    .setContentText("Grouped notification text")
    .setGroup("group_messages")
    .setGroupSummary(true)
    .build()

Como último paso, puede hacer una ifverificación para asegurarse de que tiene más de 1 notificaciones con el mismo grupo y luego notificar con una notificación grupal:

val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

val notificationManagerCompat = NotificationManagerCompat.from(applicationContext)
notificationManagerCompat.notify(ID, newMessageNotification1)

val amountOfNotificationsInSameGroup = notificationManager.activeNotifications
                    // Here we filter notifications that are under same group
                    .filter { it.notification.group == "group_messages" }
                    .size

if (amountOfNotificationsInSameGroup >= 2) {
    // if we already have minimum of 2 notifications, we'll group them under summary notification
    notificationManagerCompat.notify(SUMMARY_NOTIFICATION_ID, summaryNotification)
}

Puedes combinar el código en tu onMessageReceivedmétodo. Como puede ver, ahora puede tener una intención personalizada para manejar notificaciones agrupadas. Puede leer más sobre las notificaciones agrupadas aquí .

Solución 2: si no desea manejar la creación de notificaciones y aún quiere saber si las notificaciones están agrupadas, puede intentar la siguiente solución:

NotificationManagertiene la función getActiveNotifications () que devolverá las notificaciones que la aplicación de llamada haya publicado y que el usuario aún no haya descartado. Cuando haces clic en notificaciones agrupadas en Android, las notificaciones no se descartarán. Por lo tanto, puede verificar el tamaño de las notificaciones activas en su actividad de iniciador para detectar si la aplicación se inició haciendo clic en notificaciones agrupadas / agrupadas:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val notificationManager =
            applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (notificationManager.activeNotifications.size >= 4) {
            // Notifications are grouped
            // Put your logic here

            // Do not forget to clear notifications
            NotificationManagerCompat.from(this).cancelAll()
        }
    }
}

Personalmente, preferiría la primera solución, pero de acuerdo con los problemas que haya publicado, también puede usar la segunda opción, pero tenga en cuenta que no podrá diferenciar si la aplicación se inició desde el iniciador o haciendo clic en notificación agrupada.

Con la segunda solución puede haber las siguientes preguntas:

P1: ¿Cómo puedo diferenciar el clic normal de notificación del grupo uno en la misma actividad?

- Simplemente puede definir click_actiony reenviar clics de notificación normales a diferentes actividades. Revisa los documentos .

Si desea reemplazar las notificaciones anteriores, también puede definir lo mismo tagen su JSON de notificaciones en el lado del backend. De esta manera, las notificaciones no se agruparán porque las notificaciones más nuevas reemplazarán a las antiguas con la misma etiqueta. Revisa los documentos .

Espero que mi respuesta ayude.

Natig Babayev
fuente
Solo creste la PN cuando la aplicación está en primer plano. El método OnMessageReceived no se ejecuta cuando la aplicación está cerrada. He visto documentación que dice que incluso si logro hacer que la aplicación maneje PN cuando la aplicación está cerrada o en segundo plano, eso no funciona muy bien.
StackOverflower
Funciona Probablemente no lo uses correctamente. ¿Podría poner su código y hacer referencia a documentos que indiquen que no puede crear notificaciones manualmente?
Natig Babayev
@StackOverflower puede usar mensajes de datos en firbebase y de esa manera puede crear sus notificaciones incluso cuando la aplicación se elimine en el método
onMessageReceived
Los enlaces que ha compartido no dicen que no se recomienda y parece que el problema está ocurriendo en algunos dispositivos. ¿Cómo ha implementado las notificaciones en su aplicación?
Natig Babayev
0

La respuesta de @Natig Babayev está bien explicada. Sin embargo, en la segunda parte no ha explicado la forma de distinguir si la aplicación se abrió haciendo clic en el ícono del iniciador o haciendo clic en Push Notification Bundle (considere el caso cuando hay 5 notificaciones que se agrupan automáticamente, pero el usuario inicia el aplicación haciendo clic en el iniciador de aplicaciones y no en el paquete de notificaciones).

Una solución podría ser desactivar las notificaciones de agrupación automática . Sin embargo, esto no es posible . Consulte esta pregunta y esta también

Investigué muchas opciones diferentes y descubrí que la mejor solución sería agrupar las notificaciones usted mismo antes de que lo haga el sistema Android o limitar la cantidad de notificaciones para maximizar las notificaciones desagrupadas al eliminar las notificaciones más antiguas o agruparlas en un paquete separado.

También puede referirse a lo siguiente

  1. https://stackoverflow.com/a/47073575/9640177
  2. https://stackoverflow.com/a/34961716/9640177
mayank1513
fuente