wake-up-neo.com

getIntent () Extras immer NULL

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 wird in meiner Anwendung NUR EINMAL aufgerufen und zeigt eine Benachrichtigung mit einem Fortschrittsbalken an (alles korrekt).

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

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

aber Extras ist immer NULL!

Ich habe versucht, eine Kombination aus:

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.

74
Magius

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

Wenn also 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 sind nichtnull).

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

Verwenden Sie diese Option, um die Benachrichtigungsabsicht zu ermitteln, während die Anwendung ausgeführt wird

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

und dann onNewIntent(Intent newintent) überschreiben.

Wenn eine Anwendung zum ersten Mal ausgeführt wird, kann getIntent() verwendet werden, und wenn die Anwendung aus dem Ruhezustand fortgesetzt wird, funktioniert onNewIntent.

113
Magius

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);
}
90
coolcool1994

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

Lösung: Setze die globale Variable int UNIQUE_INT_PER_CALL = 0 und erstelle einen pendingIntent-Aufruf wie unten.

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.
15

Da anscheinend Ihre Aktivität bereits ausgeführt wird, müssen Sie FLAG_UPDATE_CURRENT Angeben, da sonst der getIntent() -Aufruf den vorherigen zurückgibt. Siehe diese Antwort .

3
dmon