wake-up-neo.com

Absicht von Benachrichtigung hat keine Extras

Dies scheint ein häufiges Problem zu sein, und ich habe alle verwandten Fragen durchgegangen, die ich bereits finden konnte: Aktivität nimmt keine neuen Absichten an , Warum werden keine zusätzlichen Daten (Ganzzahl) in der Android-Benachrichtigung gesendet Absicht? , Benachrichtigung überholt alte Absicht Extras , Kann keine Extras für eine Absicht in der Benachrichtigung setzen , Androides Problem mit ausstehender Absicht ; kann es aber immer noch nicht herausfinden.

Problem ist das gleiche. Ich habe eine Benachrichtigung mit einem PendingIntent mit zusätzlichen Informationen eingerichtet und erhalte es 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 Bundle ist eigentlich nicht da (getExtras () gibt null zurück).

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

Wie im Code gezeigt, verwende ich getCurrentMillis, um sicherzustellen, dass sich die requestID ändert.

Es wurde auch festgestellt, dass in MyActivity onCreate und onNewIntent nicht aufgerufen werden. nur onResume ist. Obwohl der FLAG_ACTIVITY_NEW_TASK eingestellt ist ...?

Fehlt mir etwas sehr einfaches?

38
Matthieu

Wenn Sie FLAG_ACTIVITY_NEW_TASK für die Benachrichtigungsabsicht festlegen, wird Folgendes verursacht:

  • Wenn die Aktivität nicht bereits in einer Task ausgeführt wird, wird eine neue Task gestartet, und die Absicht wird an die Aktivität in onCreate() übergeben.

  • Wenn die Aktivität jedoch bereits in einer Aufgabe ausgeführt wird, wird diese Aufgabe in den Vordergrund gestellt. Das ist alles. Der Intent wird not geliefert und onNewIntent() wird nicht aufgerufen.

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

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

Es macht no egal, ob die launchMode der Aktivität singleTop ist oder nicht, Sie müssen dennoch Intent.FLAG_ACTIVITY_SINGLE_TOP im Intent angeben.

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

Mein (noch) offenes Problem im Google-Code finden Sie unter http://code.google.com/p/Android/issues/detail?id=17137

46
David Wasser

Ich habe gerade das PendingIntent.FLAG_UPDATE_CURRENT-Flag zu meiner anstehenden Absicht hinzugefügt, und es begann für mich zu arbeiten (alle Flag für Intent übersprungen).

Beispielcode:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
34
codingjeremy
  1. Wenn dies nicht erforderlich ist, können Sie vermeiden Ihre Aktivität im Manifest als einzelne Aufgabe festlegen. Lassen Sie diese Zeile aus oder ändern Sie sie in singleTop, wenn Sie können:

      Android:launchMode="singleTask”
    
  2. Wenn Sie eine einzige Aufgabe haben müssen, setzen Sie die Kennzeichen für anstehende Absichten auf: Intent. FLAG_ACTIVITY_NEW_TASK | Intent. 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 innerhalb von onNewIntent () durch setIntent (intent) zurück;

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

Einfacher Ansatz: Das eigentliche Problem besteht darin, dass die Absicht, die zum selben Ziel gehört, ersetzt wird. Ich habe dieses Problem gelöst, indem ich gerade einen neuen Dienst erstellt habe, einen "NotificationDismissalService". Die einzige Absicht, die zu diesem Dienst führt, 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 eindeutiger Absichtstyp) ist eine einfache Implementierung von "onStartCommand", die eine Absicht an den bevorzugten Dienst sendet (Lesen/Schreiben der richtigen Parameter). Da dies ein tatsächlicher Versand eines Dienstes ist, ohne dass ein Pendingintent dazwischen liegt, funktioniert es einwandfrei.

0
user1676075

Ich habe so etwas verwendet 

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

Schauen Sie sich das vollständige Beispiel an hier

0

Sie können Extras absichtlich auf folgende 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 einen zusätzlichen Wert in der Testaktivitätsklasse zu erhalten, müssen Sie den folgenden Code schreiben:

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