[android] PendingIntent funktioniert ordnungsgemäß für die erste Benachrichtigung, aber falsch für den Rest



Answers

RemoteViews mit RemoteViews und mehreren verschiedenen Intents für jede HomeScreen auf dem HomeScreen Widget. Arbeitete wenn hinzugefügt diese:

1. intent.setAction(Long.toString(System.currentTimeMillis()));

2. PendingIntent.FLAG_UPDATE_CURRENT

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(context, MyOwnActivity.class);
        intent.putExtra("foo_bar_extra_key", "foo_bar_extra_value");
        intent.setAction(Long.toString(System.currentTimeMillis()));
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);
        views.setOnClickPendingIntent(my_button_r_id_received_in_parameter, pendingIntent);
Question
  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 mehrmals aufgerufen. Ich möchte für jede notification testActivity starten, wenn Sie darauf klicken. Leider startet nur die erste Benachrichtigung testActivity. Durch Klicken auf den Rest wird das Benachrichtigungsfenster minimiert.

Zusätzliche Informationen: Die Funktion displayNotification() ist in einer Klasse namens UploadManager . Context wird von der activity , die instanziiert wird, an UploadManager . Die Funktion displayNotification() wird mehrmals von einer Funktion aufgerufen, die auch in UploadManager in einer 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 zu reflektieren, was String-Antwort war, als die Benachrichtigung erstellt wurde. Bei Verwendung von PendingIntent.FLAG_UPDATE_CURRENT spiegelt die zusätzliche "Antwort" stattdessen die String-Antwort des letzten Aufrufs von displayNotification() .

Ich weiß, warum dies der FLAG_UPDATE_CURRENT ich die Dokumentation zu FLAG_UPDATE_CURRENT . Ich bin mir jedoch nicht sicher, wie ich es im Moment umgehen soll.




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

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);



Ich hatte das gleiche Problem und habe es mit den folgenden Schritten behoben

1) Löschen Sie eine beliebige Flagge für Absicht

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

2) Fügen Sie intent.setAction mit dem folgenden Code ein

 intent.setAction(Long.toString(System.currentTimeMillis()));

3) für Pendingintent, fügen Sie den folgenden Code ein

   PendingIntent Pintent = PendingIntent.getActivity(ctx,0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

Ich hoffe, mit dir zu arbeiten




// Use pending Intent and  also use unique id for display notification....
// Get a PendingIntent containing the entire back stack
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager mNotificationManager = (NotificationManager)  sqlitewraper.context.getSystemService(Context.NOTIFICATION_SERVICE);
// Issue the notification
mNotificationManager.notify(id, builder.build());



Ich habe das gleiche Problem und benutze die PendingIntent.html.FLAG_UPDATE_CURRENT , um es zu beheben.

Ich habe den Quellcode überprüft. In ActivityManagerService.java lautet die Schlüsselmethode wie folgt. Wenn das Flag PendingIntent.FLAG_UPDATE_CURRENT ist und der updateCurrent true ist. Einige Extras werden durch neue ersetzt und wir erhalten einen Ersatz 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);
        }




Als Dokumentation sagte verwenden eindeutigen Anfrage-Code:

Wenn Sie mehrere unterschiedliche PendingIntent-Objekte benötigen, die gleichzeitig aktiv sind (z. B. zwei Benachrichtigungen, die beide gleichzeitig angezeigt werden), müssen Sie sicherstellen, dass es etwas gibt, das sich von anderen unterscheidet PendingIntents. Dies kann eines der Intent-Attribute sein, die von Intent.filterEquals berücksichtigt werden, oder unterschiedliche Anforderungscode-Ganzzahlen, die an getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast (Context, int , Intent, int) oder getService (Kontext, int, Intent, int).






Related