Absicht von Benachrichtigung hat keine Extras

Lesezeit: 7 Minuten

Benutzer-Avatar
Matthias

Dies scheint ein häufiges Problem zu sein, und ich bin alle damit verbundenen Fragen durchgegangen, die ich bereits finden konnte: Die Aktivität nimmt keine neue Absicht auf, Warum werden zusätzliche Daten (ganzzahlig) nicht in der Android-Benachrichtigungsabsicht gesendet?, Die Benachrichtigung übergibt alte Absichts-Extras, Kann keine Extras für eine Absicht in die Benachrichtigung einfügen, Android-Problem mit ausstehender Absichtsbenachrichtigung; kann das aber immer noch nicht nachvollziehen.

Problem ist das gleiche. Ich habe eine Benachrichtigung mit einem PendingIntent festgelegt, der einige zusätzliche Informationen enthält, und ich erhalte sie nicht auf der anderen Seite.

Hier ist der Code zum Generieren der Benachrichtigung:

Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;

Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);

Und auf der anderen Seite:

boolean start_test=getIntent().getBooleanExtra("start_test", false);

Das Bündel ist tatsächlich nicht vorhanden (getExtras() gibt null zurück).

Ich habe die verschiedenen Flags für versucht PendingIntent.getActivity (FLAG_UPDATE_CURRENT, FLAG_CANCEL_CURRENT, FLAG_ONE_SHOT), nichts davon hat geholfen.

Wie im Code gezeigt, verwende ich getCurrentMillis, um sicherzustellen, dass sich die Anforderungs-ID ändert….

Auch gefunden, dass in MyActivity, onCreate und onNewIntent werden nicht angerufen. nur onResume ist. Obwohl die FLAG_ACTIVITY_NEW_TASK ist eingestellt… ?

Übersehe ich etwas sehr Einfaches?

  • Wenn Sie nur ein einziges Extra hinzufügen möchten, vergessen Sie die Verwendung Bundle. Einfach verwenden new_intent.putExtra("start_test", true) dann am anderen Ende einfach verwenden getIntent.getBooleanExtra("start_test", false)

    – Squonke

    18. Juli 2012 um 22:32 Uhr

  • Ja, ich habe es auch so versucht, es hat nichts geändert … immer noch nicht auf der anderen Seite

    – Matthias

    18. Juli 2012 um 22:43 Uhr

  • Läuft Ihre Anwendung (oder im Hintergrund), wenn dies geschieht? Ist MyActivity oben auf dem Aktivitätsstapel?

    – David Wasser

    19. Juli 2012 um 14:38 Uhr

  • @DavidWasser, Ja, MyActivity läuft noch im Hintergrund (onDestroy wurde nicht aufgerufen). Nicht sicher, ob es oben auf dem Aktivitätsstapel war oder nicht in dieser Aufgabe.

    – Matthias

    19. Juli 2012 um 14:43 Uhr

  • new_intent.putExtra(“start_test”, true) dann verwenden Sie am anderen Ende einfach getIntent.getBooleanExtra(“start_test”, false) funktioniert nicht

    – schein

    1. April 2014 um 9:53 Uhr

Benutzer-Avatar
David Wasser

Einstellung FLAG_ACTIVITY_NEW_TASK für die Benachrichtigungsabsicht bewirkt Folgendes:

  • Wenn die Aktivität ist nicht bereits in einer Aufgabe läuft, wird eine neue Aufgabe gestartet und die Absicht wird an die Aktivität in geliefert onCreate()

  • Wenn die Aktivität jedoch bereits in einer Aufgabe ausgeführt wird, wird diese Aufgabe in den Vordergrund gebracht. Das ist alles. Die Absicht wird nicht geliefert werden und onNewIntent() wird nicht angerufen.

Wenn Sie möchten, dass die Absicht tatsächlich geliefert werden Sie müssen Folgendes angeben:

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

Es macht kein Unterschied ob die launchMode der Tätigkeit ist singleTop oder nicht, müssen Sie noch angeben Intent.FLAG_ACTIVITY_SINGLE_TOP in der Absicht.

Notiz: Wenn die Aktivität bereits in einer Aufgabe ausgeführt wird und die Aktivität ausgeführt wird nicht oben auf dem Aktivitätsstapel in dieser Aufgabe wird die Aufgabe in den Vordergrund gebracht. Das ist alles. Die Absicht wird nicht wird geliefert. Die einzige Möglichkeit, dies zu erreichen, wäre das Hinzufügen Intent.FLAG_ACTIVITY_CLEAR_TOP zu den anderen 2 Flags, aber dies ist möglicherweise nicht das, was Sie möchten (abhängig von Ihrem spezifischen Szenario).

Siehe mein (noch) offenes Problem zum Google-Code unter http://code.google.com/p/android/issues/detail?id=17137

  • Vielen Dank für die ausführliche Erklärung. Musste auch das Flag in PendingIntent.getActivity auf FLAG_CANCEL_CURRENT setzen sonst würde onNewIntent mehrmals aufgerufen werden. Nicht ganz sicher warum, aber es scheint jetzt wie erwartet zu funktionieren.

    – Matthias

    19. Juli 2012 um 17:49 Uhr

  • Weil es immer die erste gelieferte Absicht nimmt, nicht die aus der Benachrichtigung. Sie müssen also überschreiben – @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } damit Ihre Absichten empfangen werden.

    – Darpan

    8. Oktober 2014 um 10:29 Uhr


Benutzer-Avatar
CodierungJeremy

Ich habe gerade die hinzugefügt PendingIntent.FLAG_UPDATE_CURRENT Flag für meine ausstehende Absicht, und es fing an, für mich zu arbeiten (alle Flags für Absicht übersprungen).

Beispielcode:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

  • Danke, das hat funktioniert! 🙂 Keine Notwendigkeit, etwas mehr hinzuzufügen.

    – Makalele

    3. Mai 2015 um 16:05 Uhr

  • Dies sollte die akzeptierte Antwort sein, da sie einfacher zu implementieren ist

    – Leonard Krämer

    23. Oktober 2015 um 23:31 Uhr

  • Die akzeptierte Antwort funktionierte für mich auf API 16 nicht – dies funktionierte jedoch auf 16 – 23 perfekt

    – runfaj

    25. April 2016 um 4:44 Uhr

  • Dies ist die richtige Antwort. ein zusätzlicher Hinweis, dass onStart nicht erneut ausgelöst wird, wenn die Aktivität bereits geöffnet ist, sodass die Absicht in onResume eingecheckt werden muss

    – Silikonadler

    27. Juni 2016 um 19:45 Uhr

  • Nach mindestens 2-3 Stunden Suche hat mich das gerettet. Vielen Dank

    – Harry .Naeem

    24. September 2018 um 19:55 Uhr

  1. Wenn dann nicht benötigt vermeiden Festlegen Ihrer Aktivität im Manifest als einzelne Aufgabe. Lassen Sie diese Zeile weg oder ändern Sie sie in singleTop, wenn Sie können:

      android:launchMode="singleTask”
    
  2. Wenn Sie eine einzelne Aufgabe haben müssen, setzen Sie die Flags bei ausstehender Absicht auf: Absicht.FLAG_ACTIVITY_NEW_TASK | Absicht.FLAG_ACTIVITY_CLEAR_TASK
    Und PendingIntent.FLAG_CANCEL_CURRENT.

    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
    pIntent = PendingIntent.getActivity(context, 0, resultIntent,    PendingIntent.FLAG_CANCEL_CURRENT );
    
  3. Wenn Sie eine einzelne Aufgabe haben – Setzen Sie Ihre Extras in Ihrer Aktivität innerhalb von onNewIntent() zurück setIntent(Absicht);

    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    

  • In meinem Fall hat es mit dem Haben gut funktioniert FLAG_UPDATE_CURRENT bis zur ausstehenden Absicht

    – Nilesh Deokar

    4. November 2017 um 8:54 Uhr

Sie können Extras in folgender Weise senden

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 den Intent-Zusatzwert in der Testaktivitätsklasse zu erhalten, müssen Sie den folgenden Code schreiben:

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

Einfacherer Ansatz: Das eigentliche Problem besteht darin, dass die Absicht, die auf dasselbe Ziel gerichtet ist, ersetzt wird. Ich habe dies gelöst, indem ich gerade einen neuen Dienst erstellt habe, einen “NotificationDismissalService”. Die einzige Absicht, die an diesen Dienst geht, ist das setDeleteIntent-Element. Da es sich um einen einzigartigen Dienst handelt, werden die Parameter nicht ersetzt. Der Hauptteil von NotificationDismissalService (und es wäre wirklich ein solcher Entlassungsdienst pro eindeutigem Absichtstyp) ist eine einfache Implementierung von „onStartCommand“, die eine Absicht an den bevorzugten Dienst sendet (Lesen/Schreiben der richtigen Parameter). Da dies ein tatsächliches Senden eines Dienstes ohne eine dazwischen liegende ausstehende Absicht ist, funktioniert es einwandfrei.

Benutzer-Avatar
ReflectCode

Wenn die App nicht ausgeführt wird oder sich im Hintergrund befindet und der Benutzer auf die Benachrichtigung in der Taskleiste klickt, können Sie Intent extra abrufen und die Schlüssel überprüfen:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("RC","MainActivity.onCreate() called");

    if (getIntent().getExtras() != null){
        Bundle extra = getIntent().getExtras();
        Log.d("RC", "MainActivity.onCreate() : keys count = " + extra.keySet().size());

        for ( String key : extra.keySet()) {
            Log.d("RC","MainActivity.onCreate() : key = " + key + " = " + extra.getString(key));
        }

    }
}

Dies wird zeigen:

D/RC: MainActivity.onCreate() called
D/RC: MainActivity.onCreate() : keys count = 8
D/RC: MainActivity.onCreate() : key = google.delivered_priority = high
D/RC: MainActivity.onCreate() : key = google.sent_time = null
D/RC: MainActivity.onCreate() : key = google.ttl = null
D/RC: MainActivity.onCreate() : key = google.original_priority = high
D/RC: MainActivity.onCreate() : key = from = 631131412302
D/RC: MainActivity.onCreate() : key = google.message_id = 0:1627370460932539%952b1da9952b1da9
D/RC: MainActivity.onCreate() : key = gcm.n.analytics_data = null
D/RC: MainActivity.onCreate() : key = collapse_key = com.reflectcode.demo.cloudmessaging

Benutzer-Avatar
Panagiotis Georgiou

Ich habe so etwas verwendet

Intent myIntent = new Intent(context, DoSomething.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        Intent.FLAG_ACTIVITY_NEW_TASK);

Sehen Sie sich das vollständige Beispiel an hier

  • Das ist überhaupt kein funktionierender Code.

    – Eugen Troyanskii

    4. Mai um 15:47 Uhr

1166290cookie-checkAbsicht von Benachrichtigung hat keine Extras

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy