So senden Sie Parameter von einem Benachrichtigungsklick an eine Aktivität?

Ich kann eine Möglichkeit finden, Parameter von meiner Benachrichtigung an meine Aktivitäten 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, sodass meine Aktivität eine spezielle Artikeldetailansicht laden und präsentieren kann. Genauer gesagt, ich lade eine Datei herunter, und wenn die Datei heruntergeladen wird, möchte ich, dass die Benachrichtigung eine Absicht hat, dass sie beim Anklicken meine Aktivität in einem speziellen Modus öffnet. Ich habe versucht, putExtra auf meine Absicht putExtra , aber ich kann es nicht putExtra , 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 von meiner Aktivität, die 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 Logbuch.

Übrigens … das onCreate wird nur ausgeführt, wenn meine Aktivität startet, 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?

Solutions Collecting From Web of "So senden Sie Parameter von einem Benachrichtigungsklick an eine Aktivität?"

Sehen Sie sich dieses Handbuch ( Erstellen einer Benachrichtigung ) und die Beispiele für ApiDemos “StatusBarNotifications” und “NotificationDisplay” an.

Um zu verwalten, ob die Aktivität bereits ausgeführt wird, haben Sie zwei Möglichkeiten:

  1. Fügen Sie dem Intent FLAG_ACTIVITY_SINGLE_TOP- Flag hinzu, wenn Sie die Aktivität starten, und implementieren Sie dann in der Aktivitätsklasse onNewIntent (Intent Intent) eine Ereignisbehandlungsroutine, mit der Sie auf die neue Absicht zugreifen können, die für die Aktivität aufgerufen wurde (was nicht dasselbe ist wie GetIntent) (), wird immer die erste Absicht zurückgegeben, die Ihre Aktivität gestartet hat.

  2. Genau wie Nummer eins, aber anstatt eine Markierung zur Absicht hinzuzufügen, müssen Sie “singleTop” in Ihrer Aktivität AndroidManifest.xml hinzufügen.

Wenn Sie Intent-Extras verwenden, vergessen Sie nicht, PendingIntent.getActivity() mit dem Flag PendingIntent.FLAG_UPDATE_CURRENT , da andernfalls die gleichen Extras für jede Benachrichtigung wiederverwendet werden.

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 Nachrichtenansichtsaktivität angezeigt. Ich triggerse das Problem der gleichen zusätzlichen Parameter wird in Ansicht Nachricht Absicht erhalten.

Hier ist der Code, der das behoben hat. Code zum Erstellen der Benachrichtigung Intent.

  Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class); notificationIntent.putExtra("NotificationMessage", notificationMessage); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent); 

Code zum Anzeigen der Nachrichtenaktivität.

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onNewIntent(getIntent()); } @Override public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); if(extras != null){ if(extras.containsKey("NotificationMessage")) { setContentView(R.layout.viewmain); // extract the extra-data in the Notification String msg = extras.getString("NotificationMessage"); txtView = (TextView) findViewById(R.id.txtMessage); txtView.setText(msg); } } } 

Vielleicht ein bisschen spät, aber: statt dessen:

 public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); Log.i( "dbg","onNewIntent"); if(extras != null){ Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol")); Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol")); } mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS); } 

Benutze das:

 Bundle extras = getIntent().getExtras(); if(extras !=null) { String value = extras.getString("keyName"); } 

Treffen Sie das gleiche Problem hier. Ich löse es auf, indem ich einen anderen Anforderungscode verwende, benutze dieselbe ID wie die Benachrichtigung und erzeuge PendingIntent. weiß aber immer noch nicht, warum das gemacht werden sollte.

 PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0); notif.contentIntent = contentIntent; nm.notify(**id**, notif); 

Nachdem ich einige E-Mail-Listen und andere Foren gelesen hatte, stellte ich fest, dass der Trick scheinbar eindeutige Daten zu der Absicht hinzufügt.

so was:

  Intent notificationIntent = new Intent(Main.this, Main.class); notificationIntent.putExtra("sport_id", "sport"+id); notificationIntent.putExtra("game_url", "gameURL"+id); notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

Ich verstehe nicht, warum das getan werden muss, es hat etwas mit der Absicht zu tun, die nur durch seine Extras identifiziert werden kann …

Ich habe alles versucht, aber nichts hat funktioniert.

kam schließlich mit folgender Lösung auf.

1- in Manifest hinzufügen für die Aktivität Android: launchMode = “singleTop”

2- Wenn Sie pending intent machen, verwenden Sie bundle, anstatt direkt intent.putString () oder intent.putInt () zu verwenden.

  Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class); Bundle bundle = new Bundle(); bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId())); bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId()); bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl()); notificationIntent.putExtras(bundle); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), new Random().nextInt(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

AndroidManifest.xml

Einschließlich launchMode = “singleTop”

  

SMSReceiver.java

Setzen Sie die Flags für Intent und PendingIntent

 Intent intent = new Intent(context, MessagesDetailsActivity.class); intent.putExtra("smsMsg", smsObject.getMsg()); intent.putExtra("smsAddress", smsObject.getAddress()); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

MessageDetailsActivity.java

onResume () – wird jedes Mal aufgerufen, laden Sie die Extras.

 Intent intent = getIntent(); String extraAddress = intent.getStringExtra("smsAddress"); String extraBody = intent.getStringExtra("smsMsg"); 

Hoffe es hilft, es basierte auf anderen Antworten hier auf Stackoverflow, aber das ist das neueste, das für mich funktionierte.

Es ist einfach, das ist meine Lösung mit Objekten!

Mein POJO

 public class Person implements Serializable{ private String name; private int age; //get & set } 

Methodenbenachrichtigung

  Person person = new Person(); person.setName("david hackro"); person.setAge(10); Intent notificationIntent = new Intent(this, Person.class); notificationIntent.putExtra("person",person); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.notification_icon) .setAutoCancel(true) .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos)) .setPriority(2) .setLargeIcon(bm) .setTicker(fotomulta.getTitle()) .setContentText(fotomulta.getMessage()) .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setWhen(System.currentTimeMillis()) .setContentTitle(fotomulta.getTicketText()) .setDefaults(Notification.DEFAULT_ALL); 

Neue Aktivität

  private Person person; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notification_push); person = (Person) getIntent().getSerializableExtra("person"); } 

Viel Glück!!

Nach einigen Suchen habe ich eine Lösung von Android Entwickler Guide

 PendingIntent contentIntent ; Intent intent = new Intent(this,TestActivity.class); intent.putExtra("extra","Test"); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ArticleDetailedActivity.class); contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); 

Um einen zusätzlichen Wert in der Testaktivitätsklasse zu erhalten, müssen Sie folgenden Code schreiben:

  Intent intent = getIntent(); String extra = intent.getStringExtra("extra") ; 

Wenn du benutzt

 android:taskAffinity="myApp.widget.notify.activity" android:excludeFromRecents="true" 

In Ihrer AndroidManifest.xml-Datei für die zu startende Aktivität müssen Sie Folgendes in Ihrer Absicht verwenden:

 Intent notificationClick = new Intent(context, NotifyActivity.class); Bundle bdl = new Bundle(); bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem); notificationClick.putExtras(bdl); notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); // schließt tasks der app und startet einen seperaten neuen TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(NotifyActivity.class); stackBuilder.addNextIntent(notificationClick); PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(notificationPendingIntent); 

Wichtig ist, eindeutige Daten zu setzen, zB mit einer eindeutigen ID wie:

 notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); 

Verwenden PendingIntent.FLAG_UPDATE_CURRENT für Services PendingIntent.FLAG_UPDATE_CURRENT

für mich arbeiten.

Bitte verwenden Sie als PendingIntent, während die Benachrichtigung angezeigt wird, bevor sie getriggers wird.

PendingIntent intent = PendingIntent.getActivity (this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Fügen Sie PendingIntent.FLAG_UPDATE_CURRENT als letztes Feld hinzu.