PendingIntent non invia extra Intent


127

Il mio MainActicity inizia RefreshServicecon un Intentche ha un booleanextra chiamato isNextWeek.

La mia RefreshServicecrea una Notificationche inizia alla mia MainActivityquando l'utente fa clic su di essa.

questo assomiglia a questo:

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

Come puoi vedere, notificationIntentdovrebbe avere un booleanextra IS_NEXT_WEEKcon il valore di isNextWeekcui è inserito in PendingIntent.

Quando faccio clic ora, Notificationottengo sempre falseil valore diisNextWeek

Questo è il modo in cui ottengo il valore in MainActivity:

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

log:

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

Quando inizio direttamente MainActivitycon un Intentcon "NextValue" in questo modo:

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

tutto funziona bene e ottengo truequando lo isNextWeekè true.

Cosa faccio di sbagliato che c'è sempre un falsevalore?

AGGIORNARE

questo risolve il problema: https://stackoverflow.com/a/18049676/2180161

Citazione:

Il mio sospetto è che, poiché l'unica cosa che cambia negli Intenti sono gli extra, il PendingIntent.getActivity(...)metodo di fabbrica sta semplicemente riutilizzando il vecchio intento come ottimizzazione.

In RefreshService, prova:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Vedere:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

AGGIORNAMENTO 2

Vedi la risposta qui sotto perché è meglio usare PendingIntent.FLAG_UPDATE_CURRENT.


2
PendingIntent.FLAG_CANCEL_CURRENT ha lavorato per me, grazie
Pelanes,

1
mi ha salvato molte ore di lavoro. risposta corretta!
Tharaka Nirmana,

hai la domanda e la soluzione: D fantastico. Penso che dovresti aggiungerlo come risposta alle domande. + 10s è meglio di + 5s;)
Muhammed Refaat il

Riferimenti a questa soluzione: stackoverflow.com/questions/1198558/...
M.Noman

Il FLAG_UPDATE_CURRENT non è stato sufficiente nel mio caso, poiché lo stesso PendingIntent è stato riutilizzato dal mio widget. Ho finito per usare FLAG_ONE_SHOT per l'azione che si verifica raramente e ho lasciato intatto il widget PendingIntent.
Eir

Risposte:


29

L'uso di PendingIntent.FLAG_CANCEL_CURRENT non è una buona soluzione a causa dell'uso inefficiente della memoria. Utilizzare invece PendingIntent.FLAG_UPDATE_CURRENT .

Utilizza anche Intent.FLAG_ACTIVITY_SINGLE_TOP (l'attività non verrà avviata se è già in esecuzione nella parte superiore dello stack della cronologia).

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

Poi:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

Dovrebbe funzionare ora.


Se non hai ancora previsto il comportamento, prova a implementare il void onNewIntent(Intent intent)gestore eventi, in questo modo puoi accedere al nuovo intento chiamato per l'attività (che non è lo stesso che chiamare semplicemente getIntent (), questo restituirà sempre il primo Intento avviato la tua attività.

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}

21

Penso che devi aggiornare il Intentquando ne ricevi uno nuovo sostituendo la onNewIntent(Intent)tua attività. Aggiungi quanto segue alla tua attività:

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

Modificare:

Ciò è necessario solo se la tua attività è già stata avviata quando viene ricevuta l'intenzione. Se la tua attività viene avviata (e non solo ripresa) dall'intento, il problema è altrove e il mio suggerimento potrebbe non risolverlo.


questo appare anche se l'attività viene chiusa e successivamente aperta con la notifica.
Maysi

3

Il seguente codice dovrebbe funzionare: -

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

In MainActivity onCreate:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}

new Notification(icon, message, when);è deprecato
maggio

Ad ogni modo farlo senza CLEAR_TOP?
Richard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.