Wie erkenne ich, dass in Android auf ein Benachrichtigungspaket / eine Benachrichtigungsgruppe geklickt wurde?

8

In Android Nougat und höher werden Push-Benachrichtigungen für Ihre App nach dem 4. Platz automatisch zusammengefasst.

Das Problem in Android ist, dass durch Klicken auf das Bundle die Push-Benachrichtigungsliste nicht erweitert wird, sondern die App geöffnet wird.

Ich muss Benutzer identifizieren, die die App über eine Push-Benachrichtigung geöffnet haben. Für einzelne Benachrichtigungen ist dies einfach, da ich Vorsatz-Extras untersuchen kann. Das Problem mit dem Bundle ist, dass die Extras null sind und die Absicht genauso aussieht, als ob der Benutzer auf das Startsymbol geklickt hätte. Ich kann anhand einer Push-Benachrichtigung nicht feststellen, dass die Navigation erfolgt ist :(

Nur für den Fall, dass es nicht klar ist: Ich verwende keine expliziten Push-Benachrichtigungsgruppen. Dies wird automatisch von Android durchgeführt. Ich habe keinen Gruppenschlüssel für die Benachrichtigungen festgelegt.

Ich benutze Firebase. Ich erstelle die Push-Benachrichtigung nur, NotificationCompatwenn sich die App im Vordergrund befindet. Diese Logik wird nicht ausgeführt, wenn sich die App im Hintergrund befindet oder geschlossen ist (wird OnMessageReceivednur mit der App im Vordergrund ausgeführt).

BEARBEITEN

Ich weiß, dass ich die PN-Nutzdaten für das Ereignis ändern kann, das OnMessageReceivedsogar im Hintergrund ausgeführt oder geschlossen wird. Ich möchte dies vermeiden, da ich viele Leute gefunden habe, die sich über Probleme mit PN beschweren, die in diesem Fall nicht ankommen.

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

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

Ich möchte einen Benutzer erkennen, der auf eine gruppierte PN tippt, auch wenn die App diese nicht erstellt hat.

StackOverflower
quelle
AFAIK sollte durch Tippen auf das Chevron-Symbol des Bundles die Benachrichtigungsliste erweitern / reduzieren.
Edric
@Edric: das stimmt ... aber ich kann den Benutzer nicht dazu zwingen. Einige Benutzer klicken auf die reduzierte Push-Benachrichtigung, und ich möchte mit dieser Situation umgehen.
StackOverflower
Mit Benachrichtigungen, die serverseitig und nicht clientseitig generiert werden, meinen Sie, dass Sie FCM verwenden, oder? Selbst in diesem Fall verwenden Sie immer noch developer.android.com/reference/android/app/… , richtig? Könnten Sie ein Code-Snippet teilen?
Arnab Saha
@ArnabSaha: Ich kann nicht, weil mein Code zum Erstellen der Benachrichtigung nicht ausgeführt werden würde, wenn die App im Hintergrund oder geschlossen ist
Claudio Redi
Wissen Sie vorher, wann Benachrichtigungen gruppiert werden?
Natig Babayev

Antworten:

4

Lösung 1: Wenn Sie die Erstellung der Benachrichtigungen durchführen, können Sie die folgenden Schritte ausführen:

Zunächst können Sie jedes Mal, wenn Sie eine neue Benachrichtigung erstellen, diese nach demselben Schlüssel gruppieren, indem Sie Folgendes verwenden setGroup(...):

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

Wenn Sie Benachrichtigungen nach derselben ID ("group_messages") gruppiert haben , können Sie jetzt eine zusammenfassende Benachrichtigung mit unterschiedlicher Absicht erstellen:

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()

Als letzten Schritt können Sie ifüberprüfen, ob Sie mehr als eine Benachrichtigung mit derselben Gruppe haben, und dann mit einer Gruppenbenachrichtigung benachrichtigen:

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)
}

Sie können den Code in Ihrer onMessageReceivedMethode kombinieren . Wie Sie sehen, können Sie jetzt benutzerdefinierte Absichten haben, gruppierte Benachrichtigungen zu verarbeiten. Weitere Informationen zu gruppierten Benachrichtigungen finden Sie hier .

Lösung 2: Wenn Sie die Erstellung von Benachrichtigungen nicht verarbeiten möchten und dennoch wissen möchten, ob die Benachrichtigungen gruppiert sind, können Sie die folgende Lösung ausprobieren:

NotificationManagerhat die Funktion getActiveNotifications () , die Benachrichtigungen zurückgibt , die von der aufrufenden App gepostet und vom Benutzer noch nicht verworfen wurden. Wenn Sie in Android auf gruppierte Benachrichtigungen klicken, werden Benachrichtigungen nicht geschlossen. Daher können Sie die Größe der aktiven Benachrichtigungen in Ihrer Launcher-Aktivität überprüfen, um festzustellen, ob die App gestartet wurde, indem Sie auf gruppierte / gebündelte Benachrichtigungen klicken:

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()
        }
    }
}

Persönlich würde ich die erste Lösung bevorzugen, aber entsprechend den von Ihnen veröffentlichten Problemen können Sie auch die zweite Option verwenden. Beachten Sie jedoch, dass Sie nicht unterscheiden können, ob die App über den Launcher oder durch Klicken auf gruppierte Benachrichtigung gestartet wurde.

Bei der zweiten Lösung können folgende Fragen auftreten:

Frage 1: Wie kann ich einen normalen Benachrichtigungsklick von einer Gruppe in derselben Aktivität unterscheiden?

- Sie können einfach click_actionnormale Benachrichtigungsklicks definieren und an verschiedene Aktivitäten weiterleiten. Überprüfen Sie die Dokumente .

Wenn Sie frühere Benachrichtigungen ersetzen möchten, können Sie diese auch tagin Ihrem Benachrichtigungs-JSON auf der Backend-Seite definieren. Auf diese Weise werden Benachrichtigungen nicht gebündelt, da neuere Benachrichtigungen die alte durch dasselbe Tag ersetzen. Überprüfen Sie die Dokumente .

Ich hoffe meine Antwort hilft.

Natig Babayev
quelle
Ich erklimme die PN nur, wenn die App im Vordergrund steht. Die Methode OnMessageReceived wird nicht ausgeführt, wenn die App geschlossen wird. Ich habe eine Dokumentation gesehen, die besagt, dass selbst wenn ich es schaffe, dass die App PN verarbeitet, wenn die App geschlossen ist oder im Hintergrund, dies überhaupt nicht gut funktioniert.
StackOverflower
Es funktioniert. Wahrscheinlich benutzt du es nicht richtig. Könnten Sie Ihren Code einfügen und auf Dokumente verweisen, die besagen, dass Sie Benachrichtigungen nicht manuell erstellen können?
Natig Babayev
@StackOverflower Sie können Datennachrichten in firbebase verwenden und auf diese Weise können Sie Ihre Benachrichtigungen erstellen, auch wenn App auf onMessageReceived-Methode beendet wird
Natig Babayev
Von Ihnen freigegebene Links bedeuten nicht, dass dies nicht empfohlen wird, und es scheint, dass das Problem auf wenigen Geräten auftritt. Wie haben Sie Benachrichtigungen in Ihre App implementiert?
Natig Babayev
0

Die Antwort von @Natig Babayev ist gut erklärt. Im zweiten Teil hat er jedoch nicht erklärt, wie man unterscheiden kann, ob die App durch Klicken auf das Startsymbol oder durch Klicken auf Push-Benachrichtigungspaket geöffnet wurde (berücksichtigen Sie den Fall, wenn 5 Benachrichtigungen automatisch gruppiert werden, der Benutzer jedoch die App durch Klicken auf den App Launcher und nicht auf das Benachrichtigungspaket.)

Eine Lösung könnte darin bestehen, automatische Gruppierungsbenachrichtigungen zu deaktivieren . Dies ist jedoch nicht möglich . Beziehen Sie sich auf diese und diese Frage

Ich habe viele verschiedene Optionen untersucht und festgestellt, dass die beste Lösung darin besteht, die Benachrichtigung selbst zu gruppieren, bevor das Android-System dies tut, oder die Anzahl der Benachrichtigungen auf maximal nicht gruppierte Benachrichtigungen zu beschränken, indem ältere Benachrichtigungen entfernt oder in einem separaten Paket zusammengefasst werden.

Sie können sich auch auf Folgendes beziehen

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