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!
Antworten:
Richtig.
Das hängt davon ab, ob Sie zwei Alarme haben, die gleichzeitig registriert werden oder nicht.
Wenn nicht, können Sie verwenden ,
FLAG_ONE_SHOT
oder eine der anderenPendingIntent
Flaggen Ihren zweiter hatPendingIntent
Gebrauch die neueren Extras.Wenn aber, werden Sie zwei Alarme auf einmal registriert haben, mit verschiedenen
Intent
Extras, müssen Sie die beiden machenIntents
mehr abweichen, so dass seinfilterEquals()
zurückkehrt ,false
wenn die beiden zu vergleichen. Sie können beispielsweise unterschiedliche Werte aufrufensetData()
odersetAction()
angebenIntent
.quelle
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();
quelle
TaskStackBuilder
es verwendet wird, haben wir dort eine Methode.getPendingIntent(int requestCode, int flags)
Hier kann diese requestID übergeben werden.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 );
quelle
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);
quelle
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
quelle