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 onResume
Ereignis.
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.
android
notifications
android-intent
Magius
quelle
quelle
Antworten:
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 nichtnull
).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,onNewIntent
funktioniert sie.quelle
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); }
quelle
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.
quelle
int notificationId = new Random().nextInt();
Da Ihre Aktivität anscheinend bereits ausgeführt wird, müssen Sie sie angeben
FLAG_UPDATE_CURRENT
, da sonstgetIntent()
der vorherige Aufruf zurückgegeben wird. Siehe diese Antwort .quelle
In den freigegebenen Einstellungen finden Sie Informationen zum Übergeben und Abrufen persistenter Schlüssel / Wert-Paare.
quelle