Android ausstehende Absicht Benachrichtigung Problem

74

Ich habe einen Alarm in meiner App und es wird eine Benachrichtigung gestartet, dass dann, wenn gedrückt, eine Aktivität gestartet wird. Das Problem ist, dass wenn ich mehr als einen Alarm erstelle, die über die Benachrichtigung gestartete Aktivität dieselben Extras wie die erste erhält. Ich denke, das Problem liegt entweder in der Absicht, die ich in die ausstehende Absicht oder in die ausstehende Absicht selbst gesteckt habe. Ich glaube, ich muss vielleicht eine Flagge auf eine davon setzen, aber ich weiß nicht, welche.

Intent showIntent =new Intent(context, notificationreceiver.class);
    showIntent.putExtra("details", alarmname);

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
        showIntent, 0); 

    notification.setLatestEventInfo(context, "The event is imminent",
            alarmname, contentIntent);

Und der Empfänger der Benachrichtigung

Bundle b = getIntent().getExtras();
    String eventname = b.getString("details");
    details.setText(eventname);

Das Extra "Details" ist bei jedem nächsten Mal gleich, wenn eine Benachrichtigung erfolgt, anstatt den anderen Wert zu haben. Bis ich die Absichten festgelegt habe, bin ich sicher, dass der richtige Wert zu den "Details" gehört, so dass es ein Problem ist, die erste Absicht jedes Mal zu erhalten, wenn ich eine Benachrichtigung drücke. Wie kann ich es schaffen, die richtigen Absichten zu starten? Hoffe ich war so klar wie ich konnte Danke!

spagi
quelle
Da ich eine eindeutige Benachrichtigungs-ID verwende, um den Status zu verfolgen (Statusleisten-Benachrichtigung), verwende ich dieselbe Variable, um sie an mein PendingIntent zu übergeben, wodurch sie eindeutig wird.

Antworten:

71

Das Problem ist, dass wenn ich mehr als einen Alarm erstelle, die über die Benachrichtigung gestartete Aktivität dieselben Extras wie die erste erhält.

Richtig.

Wie kann ich es schaffen, die richtigen Absichten zu starten?

Das hängt davon ab, ob Sie zwei Alarme haben, die gleichzeitig registriert werden oder nicht.

Wenn nicht, können Sie verwenden , FLAG_ONE_SHOToder eine der anderen PendingIntentFlaggen Ihren zweiter hat PendingIntentGebrauch die neueren Extras.

Wenn aber, werden Sie zwei Alarme auf einmal registriert haben, mit verschiedenen IntentExtras, müssen Sie die beiden machen Intentsmehr abweichen, so dass sein filterEquals()zurückkehrt , falsewenn die beiden zu vergleichen. Sie können beispielsweise unterschiedliche Werte aufrufen setData()oder setAction()angeben Intent.

CommonsWare
quelle
2
Mann vielen Dank für die Hilfe. Da die Möglichkeit besteht, dass Alarme zusammen ausgelöst werden und mehr als eine Benachrichtigung in der Benachrichtigungsleiste angezeigt wird, habe ich das Flag FLAG_UPDATE_CURRENT für die ausstehende Absicht verwendet. Aber das eigentliche Geschäft war, wie Sie sagten, um Action auf die Absicht mit dem Alarmnamen zu setzen, und jetzt konnte es wissen, welche Absichten unterschiedlich und welche gleich sind. Danke noch einmal!
Spagi
2
setAction hat auch bei mir funktioniert. Ich frage mich nur, warum das offizielle SDK es nicht erwähnt.
Roman Royter
setAction funktioniert dank einer TON. Die Verwendung von setAction hat mir geholfen, alle anstehenden Inhalte zu unterscheiden, einfach fantastisch!
Soham
Verwenden von setAction, um für jeden Inhalt eine andere Aktion festzulegen. Absicht war für mich der Schlüssel. Danke vielmals!
Christian García
2
Sie können auch einen anderen Anforderungscode verwenden, wenn Sie ausstehende Absichten mit einem Hash erstellen.
Dies
121

Die Art , wie ich dieses Problem gelöst war durch eine eindeutige Zuordnung requestCode , wenn Sie die PendingIntent erhalten:

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

Auf diese Weise registrieren Sie sich beim System mit verschiedenen / eindeutigen Absichtsinstanzen. Tipp: Eine gute Möglichkeit, den requestCode eindeutig zu machen, besteht darin, die aktuelle Systemzeit an ihn zu übergeben.

int requestID = (int) System.currentTimeMillis();
U-Ramos
quelle
9
requestCode wird zwar noch von nichts verwendet, aber es macht die Absichten einzigartig, wodurch verhindert wird, dass sie überschrieben werden! Hervorragende Arbeit u-ramos!
Kitteh
1
Selbst wenn TaskStackBuilderes verwendet wird, haben wir dort eine Methode. getPendingIntent(int requestCode, int flags)Hier kann diese requestID übergeben werden.
Abdullah Shoaib
3
Seien Sie vorsichtig, currentTimeMillis ist typlang. Wenn Sie also in int umwandeln, wird es abgeschnitten. Ich weiß nicht, wie wahrscheinlich es ist und ob es darauf ankommt, aber es könnte wiederholt werden. In diesem Fall können Sie einen statischen inkrementierten Wert verwenden
djpeinado
Tolle Lösung. Heute habe ich erfahren, wofür requestCode ist
Bibaswann Bandyopadhyay
Vielen Dank! Perfekte Lösung!
Ruclip
0

Ich hatte dieses Problem in meiner App und habe nur eine Zufallszahl generiert, um die überschreibende Benachrichtigungsabsicht zu überwinden:

int random= new Random().nextInt();
PendingIntent resultPendingIntent =
      stackBuilder.getPendingIntent(
              random,
              PendingIntent.FLAG_UPDATE_CURRENT
      );
bsh
quelle
0

Ich folgte der von U-ramos bereitgestellten Lösung und dies funktionierte für mich

int requestID = (int) System.currentTimeMillis();

PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, showIntent, 0);
Damm. Matics
quelle
-1

eine andere Lösung:

Verwenden Sie PendingIntent.FLAG_UPDATE_CURRENT wie folgt :

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);

das hat bei mir funktioniert

Abeer Sul
quelle
2
Das funktioniert nicht. Es ersetzt die alten Parameter und ersetzt durch neue
Bibaswann Bandyopadhyay