getIntent () Extras immer NULL

77

Ich habe eine einfache Android-App geschrieben, die eine benutzerdefinierte Benachrichtigung wie diese anzeigt:

Context context = getApplicationContext();          
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification( R.drawable.icon, title, System.currentTimeMillis());  
Intent notificationIntent = new Intent( context,  this.getClass()); 
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE"); 
PendingIntent pendingIntent = PendingIntent.getActivity( context , 0, notificationIntent, 0);               
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(context.getPackageName(), R.layout.notifypbar);
notification.contentIntent = pendingIntent;

notification.contentView.setTextViewText(R.id.notifypb_status_text, text);
notification.contentView.setProgressBar(R.id.notifypb_status_progress, 100, (int)(100*progress), false);

manager.notify(104, notification);

Dieser Code heißt in meiner Anwendung NUR EINMAL und zeigt eine Benachrichtigung mit einem Fortschrittsbalken an (alles korrekt).

Wenn ein Benutzer auf diese Benachrichtigung klickt, behandelt meine Anwendung das onResumeEreignis.

public void onResume()
{
    super.onResume();
    // TODO: Extras è SEMPRE NULL!!! impossibile!
    Intent callingintent = getIntent(); 
    Bundle extras = callingintent.getExtras();

aber Extras ist immer NULL!

Ich habe eine beliebige Kombination von:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

oder

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

aber getIntent (). getExtras () gibt immer NULL zurück.

Magius
quelle
Haben Sie versucht, den Anwendungskontext in der Benachrichtigung festzulegen?
Apesa

Antworten:

118

Dies ist das Szenario:
Die Methode getIntent()gibt die FIRST-Absicht als Startaktivität zurück.

Wenn die Aktivität GESCHLOSSEN (beendet) ist und der Benutzer auf die Benachrichtigung klickt, wird eine neue Instanz der Aktivität ausgeführt und getIntent()funktioniert wie erwartet (Extras nicht null ).

Wenn die Aktivität jedoch "schläft" (im Hintergrund) und der Benutzer auf die Benachrichtigung klickt, wird getIntent()immer die allererste Absicht zurückgegeben, mit der die Aktivität gestartet wurde, und NICHT die Benachrichtigungsabsicht.

Verwenden Sie dies einfach, um die Benachrichtigungsabsicht zu erfassen, während die Anwendung ausgeführt wird

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

und dann überschreiben onNewIntent(Intent newintent).

Wenn also eine Anwendung zum ersten Mal ausgeführt wird, getIntent()verwendet werden kann und wenn die Anwendung aus dem Ruhezustand wieder aufgenommen wird, onNewIntentfunktioniert sie.

Magius
quelle
44
Folgendes hat für mich funktioniert: PendingIntent pendingIntent = PendingIntent.getActivity (Kontext, 0, Absicht, PendingIntent.FLAG_UPDATE_CURRENT);
user672009
3
awsme Antwort .. Ich habe viel Zeit verschwendet, um dieses Problem zu debuggen. Vielen Dank.
Deepak
In meinem Fall fügen Sie mehr Android hinzu: launchMode = "singleTask" in der Launcher-Aktivität. Vielen Dank!
Cuong Nguyen
97

Schreiben Sie diesen Code einfach über Ihre Resume () -Methode. Das ist alles was es braucht. Dies erfrischt die Absicht - ich weiß es nicht wirklich, aber es funktioniert.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
coolcool1994
quelle
1
Diese Lösung funktionierte für mich in einer Aktivität, die nicht im Service getestet wurde.
coolcool1994
2
Du bist ein Lebensretter !
Farouk Touzi
3
Speichern Sie meinen Tag nach 2 Tagen :))))
20

Problem: Sie senden denselben Anforderungscode für Ihre ausstehende Intensität. Ändere das.

Lösung : Setzen Sie die globale Variable int UNIQUE_INT_PER_CALL = 0 und beim Erstellen eines anstehenden Aufrufs wie unten beschrieben.

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.
Muhammad Mubashir
quelle
1
Das hat bei mir funktioniert. Ich habe das benutztint notificationId = new Random().nextInt();
Jonas Borggren
Ok, das löst mein Problem. Können Sie näher erläutern, warum dies wichtig ist? In meinem Fall sende ich nur eine Absicht.
Jellyfication
3

Da Ihre Aktivität anscheinend bereits ausgeführt wird, müssen Sie sie angeben FLAG_UPDATE_CURRENT, da sonst getIntent()der vorherige Aufruf zurückgegeben wird. Siehe diese Antwort .

dmon
quelle
Ich hatte jedoch keine "VORHERIGE" Absicht in meiner Bewerbung. Dieser Code wird nur EINMAL aufgerufen und danach wird keine andere Absicht erstellt oder aktualisiert.
Magius
Alle Aktivitäten werden mit Absichten gestartet, daher muss es eine vorherige Absicht geben. Hah, ich habe gerade deine eigene Antwort gesehen, das habe ich gemeint!
dmon
1
Das hat es für mich gelöst. Hier ist, wo Sie dieses Flag setzen können: developer.android.com/reference/android/app/…
finiteloop
-9

In den freigegebenen Einstellungen finden Sie Informationen zum Übergeben und Abrufen persistenter Schlüssel / Wert-Paare.

Apesa
quelle
Ich muss keine Daten in Einstellungen speichern. Ich verwende gemeinsame Einstellungen für andere Zwecke. Ich muss ExtraData durch Intent übergeben.
Magius