Ich kann anhand meiner Benachrichtigung einen Weg finden, Parameter an meine Aktivität zu senden.
Ich habe einen Dienst, der eine Benachrichtigung erstellt. Wenn der Benutzer auf die Benachrichtigung klickt, möchte ich meine Hauptaktivität mit einigen speziellen Parametern öffnen. ZB eine Artikel-ID, damit meine Aktivität eine spezielle Artikeldetailansicht laden und anzeigen kann. Genauer gesagt, ich lade eine Datei herunter, und wenn die Datei heruntergeladen wird, soll die Benachrichtigung die Absicht haben, dass beim Klicken meine Aktivität in einem speziellen Modus geöffnet wird. Ich habe versucht, putExtra
meine Absicht zu nutzen , kann sie aber nicht extrahieren, also denke ich, dass ich es falsch mache.
Code von meinem Dienst, der die Benachrichtigung erstellt:
// construct the Notification object.
final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());
final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image, R.drawable.icon);
contentView.setTextViewText(R.id.text, tickerText);
contentView.setProgressBar(R.id.progress,100,0, false);
notif.contentView = contentView;
Intent notificationIntent = new Intent(context, Main.class);
notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(id, notif);
Code aus meiner Aktivität, der versucht, den zusätzlichen Parameter aus der Benachrichtigung abzurufen:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bundle extras = getIntent().getExtras();
if(extras != null){
Log.i( "dd","Extra:" + extras.getString("item_id") );
}
Die Extras sind immer null und ich bekomme nie etwas in mein Log.
Übrigens ... das onCreate
wird nur ausgeführt, wenn meine Aktivität beginnt. Wenn meine Aktivität bereits gestartet ist, möchte ich auch die Extras sammeln und meine Aktivität gemäß der item_id präsentieren, die ich erhalte.
Irgendwelche Ideen?
quelle
PendingIntent.getActivity()
mit der Flagge anrufenPendingIntent.FLAG_UPDATE_CURRENT
, andernfalls werden dieselben Extras für jede Benachrichtigung wiederverwendet.onNewIntent()
war der Schlüssel :)PendingIntent.getActivity()
zusätzlich zu den EinstellungenFLAG_ACTIVITY_SINGLE_TOP
fürIntent
undFLAG_UPDATE_CURRENT
für unterschiedliche Anforderungs-IDs verwendenPendingIntent
. Siehe stackoverflow.com/questions/7370324/…Ich hatte das ähnliche Problem, dass meine Anwendung Nachrichtenbenachrichtigungen anzeigt. Wenn mehrere Benachrichtigungen vorhanden sind und auf jede Benachrichtigung geklickt wird, werden diese Benachrichtigungsdetails in einer Ansichtsnachrichtenaktivität angezeigt. Ich habe das Problem gelöst, dass dieselben zusätzlichen Parameter in der Absicht der Ansichtsnachricht empfangen werden.
Hier ist der Code, der dies behoben hat. Code zum Erstellen der Benachrichtigungsabsicht.
Code zum Anzeigen der Nachrichtenaktivität.
quelle
Vielleicht etwas spät, aber: stattdessen:
Benutze das:
quelle
Treffen Sie hier auf dasselbe Problem. Ich löse es, indem ich einen anderen Anforderungscode verwende, dieselbe ID als Benachrichtigung verwende, während ich PendingIntent erstelle. aber ich weiß immer noch nicht, warum das getan werden soll.
quelle
Nachdem ich einige E-Mail-Listen und andere Foren gelesen hatte, stellte ich fest, dass der Trick der Absicht einige eindeutige Daten hinzuzufügen scheint.
so was:
Ich verstehe nicht, warum dies getan werden muss. Es hat etwas mit der Absicht zu tun, kann nicht nur durch seine Extras identifiziert werden ...
quelle
requestID
Ich habe alles versucht, aber nichts hat funktioniert.
kam schließlich mit folgender Lösung.
1- im Manifest für die Aktivität Android hinzufügen: launchMode = "singleTop"
2- Verwenden Sie das Bundle, während Sie ausstehende Absichten ausführen, und verwenden Sie das Bundle, anstatt direkt intent.putString () oder intent.putInt () zu verwenden.
quelle
AndroidManifest.xml
Include launchMode = "singleTop"
SMSReceiver.java
Setzen Sie die Flags für Intent und PendingIntent
MessageDetailsActivity.java
onResume () - wird jedes Mal aufgerufen, lade die Extras.
Ich hoffe, es hilft, es basiert auf anderen Antworten hier auf Stackoverflow, aber dies ist die aktuellste, die für mich funktioniert hat.
quelle
Es ist einfach, das ist meine Lösung mit Objekten!
Mein POJO
Methodenbenachrichtigung
Neue Aktivität
Viel Glück!!
quelle
Nach einiger Suche bekam ich eine Lösung aus dem Android Developer Guide
Um einen zusätzlichen Wert für die Absicht in der Testaktivitätsklasse zu erhalten, müssen Sie folgenden Code schreiben:
quelle
stackBuilder
?Verwenden Sie in Ihrer Benachrichtigungsimplementierung einen Code wie den folgenden:
Verwenden Sie den folgenden Code, um zusätzliche Werte für Intent in der ExampleActivity abzurufen:
SEHR WICHTIGER HINWEIS : Die Intent :: putExtra () -Methode ist überladen . Um den zusätzlichen Schlüssel zu erhalten, müssen Sie die Methode Intent :: get [Type] Extra () verwenden.
Hinweis: NOTIFICATION_ID und NOTIFICATION_CHANNEL_ID sind in ExampleActivity deklarierte Konstanten
quelle
G'day, ich kann auch sagen, dass ich alles versucht habe, was in diesen Posts erwähnt wurde, und ein paar mehr von woanders. Das größte Problem für mich war, dass der neue Intent immer ein Null-Bundle hatte. Mein Problem bestand darin, mich zu sehr auf die Details von "Habe ich dies oder das aufgenommen?" Zu konzentrieren. Meine Lösung bestand darin, einen Schritt vom Detail zurückzutreten und die Gesamtstruktur der Benachrichtigung zu betrachten. Als ich das tat, gelang es mir, die wichtigsten Teile des Codes in der richtigen Reihenfolge zu platzieren. Wenn Sie ähnliche Probleme haben, suchen Sie nach:
// Ich mag es, den Datentyp viel besser anzugeben. zB bundle.putInt
Mit dieser Sequenz bekomme ich ein gültiges Bundle.
quelle
Wenn du benutzt
In Ihrer AndroidManifest.xml-Datei, damit die Aktivität gestartet werden kann, müssen Sie in Ihrer Absicht Folgendes verwenden:
Wichtig ist, eindeutige Daten festzulegen, z. B. mit einer eindeutigen ID wie:
quelle
für die Nutzung von Diensten
PendingIntent.FLAG_UPDATE_CURRENT
für mich arbeiten.
quelle
Bitte verwenden Sie als PendingIntent, während Sie eine Benachrichtigung anzeigen, da diese dann behoben wird.
PendingIntent intent = PendingIntent.getActivity (this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Fügen Sie PendingIntent.FLAG_UPDATE_CURRENT als letztes Feld hinzu.
quelle