97 Stimmen

PendingIntent funktioniert bei der ersten Meldung korrekt, bei den übrigen Meldungen jedoch nicht

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

    Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
    notification.setLatestEventInfo(context, "Upload", response, pendingIntent);

    nManager.notify((int)System.currentTimeMillis(), notification);
}

Diese Funktion wird mehrere Male aufgerufen. Ich möchte für jede notification um testActivity zu starten, wenn sie angeklickt wird. Leider wird testActivity nur durch die erste Benachrichtigung gestartet. Wenn Sie auf die anderen klicken, wird das Benachrichtigungsfenster minimiert.

Zusätzliche Informationen: Funktion displayNotification() ist in einer Klasse namens UploadManager . Context wird übergeben an UploadManager von der activity die instanziiert. Funktion displayNotification() wird mehrfach von einer Funktion aufgerufen, die sich ebenfalls im UploadManager befindet und in einem AsyncTask .

Edit 1: Ich habe vergessen zu erwähnen, dass ich die String-Antwort in Intent intent als extra .

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    intent.putExtra("response", response);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Dies macht einen großen Unterschied, da ich die zusätzliche "Antwort" benötige, um die String-Antwort bei der Erstellung der Benachrichtigung wiederzugeben. Stattdessen wird mit PendingIntent.FLAG_UPDATE_CURRENT Der Zusatz "Antwort" gibt an, wie die String-Antwort beim letzten Aufruf von displayNotification() .

Ich weiß, warum das so ist, denn ich habe die Dokumentation zu FLAG_UPDATE_CURRENT . Ich bin mir jedoch nicht sicher, wie man das Problem im Moment umgehen kann.

0voto

Amal Kronz Punkte 1637

Um die Daten korrekt zu senden, sollten Sie die Benachrichtigungs-ID mit der ausstehenden Absicht wie folgt senden: PendingIntent pendingIntent = PendingIntent.getActivity(context, (int)System.currentTimeMillis() , intent, PendingIntent.FLAG_UPDATE_CURRENT);

0voto

qin hao Punkte 43

Ich habe das gleiche Problem und verwende die PendingIntent.html.FLAG_UPDATE_CURRENT um es zu reparieren.

Ich habe den Quellcode überprüft. Unter ActivityManagerService.java ist die Schlüsselmethode wie folgt. Wenn das Flag PendingIntent.FLAG_UPDATE_CURRENT lautet und updateCurrent true ist. Einige Extras werden durch neue ersetzt und wir erhalten ein ersetztes PendingIntent.

    IIntentSender getIntentSenderLocked(int type, String packageName,
            int callingUid, int userId, IBinder token, String resultWho,
            int requestCode, Intent[] intents, String[] resolvedTypes, int flags,
            Bundle bOptions) {

// ... omitted

        final boolean noCreate = (flags&PendingIntent.FLAG_NO_CREATE) != 0;
        final boolean cancelCurrent = (flags&PendingIntent.FLAG_CANCEL_CURRENT) != 0;
        final boolean updateCurrent = (flags&PendingIntent.FLAG_UPDATE_CURRENT) != 0;
        flags &= ~(PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_CANCEL_CURRENT
                |PendingIntent.FLAG_UPDATE_CURRENT);

        PendingIntentRecord.Key key = new PendingIntentRecord.Key(
                type, packageName, activity, resultWho,
                requestCode, intents, resolvedTypes, flags, bOptions, userId);
        WeakReference<PendingIntentRecord> ref;
        ref = mIntentSenderRecords.get(key);
        PendingIntentRecord rec = ref != null ? ref.get() : null;
        if (rec != null) {
            if (!cancelCurrent) {
                if (updateCurrent) {
                    if (rec.key.requestIntent != null) {
                        rec.key.requestIntent.replaceExtras(intents != null ?
                                intents[intents.length - 1] : null);
                    }
                    if (intents != null) {
                        intents[intents.length-1] = rec.key.requestIntent;
                        rec.key.allIntents = intents;
                        rec.key.allResolvedTypes = resolvedTypes;
                    } else {
                        rec.key.allIntents = null;
                        rec.key.allResolvedTypes = null;
                    }
                }
                return rec;
            }
            rec.canceled = true;
            mIntentSenderRecords.remove(key);
        }

0voto

Somnath Punkte 149

Beim Erstellen des PendingIntent-Objekts rufen wir PendingIntent.getActivity(mContext, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT) auf;

Verwenden Sie also den folgenden Code, um den PendingIntent zu erzeugen und diesen Intent an die Benachrichtigung zu senden. Wenn Sie also eine andere Benachrichtigung erhalten, wird diese einen eindeutigen requestCode haben, um nur die Daten dieser Benachrichtigung zu erhalten.

Random objRandom = new Random();
final PendingIntent resultPendingIntent =
        PendingIntent.getActivity(
                mContext,
                objRandom.nextInt(100),
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );

-5voto

user1917789 Punkte 1

Ich hatte das gleiche Problem und konnte es beheben, indem ich die Flagge in eine andere änderte:

LayoutInflater factory = LayoutInflater.from(this);            
      final View textEntryView = factory.inflate(R.layout.appointment, null);
      AlertDialog.Builder bulider= new AlertDialog.Builder(PatientDetail.this);
      final AlertDialog alert=bulider.create();

        bulider.setTitle("Enter Date/Time");
        bulider.setView(textEntryView);
        bulider.setPositiveButton("Save", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                      EditText typeText=(EditText) textEntryView.findViewById(R.id.Editdate);
                      EditText input1 =(EditText) textEntryView.findViewById(R.id.Edittime);
                      getDateAndTime(typeText.getText().toString(),input1.getText().toString());
                }
            });
        bulider.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

        bulider.show();

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X