web-dev-qa-db-fra.com

getIntent () Extras toujours NULL

J'ai écrit une simple application Android qui affiche une notification personnalisée comme celle-ci:

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);

Ce morceau de code est appelé SEULEMENT UNE FOIS dans mon application et il affiche une notification avec une barre de progression (tout correctement).

Désormais, lorsqu'un utilisateur clique sur cette notification, mon application gère l'événement onResume.

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

mais les extras sont toujours NULL!

J'ai essayé n'importe quelle combinaison de:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

ou

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

mais getIntent (). getExtras () renvoie toujours NULL.

74
Magius

Voici le scénario:
La méthode getIntent() renvoie la PREMIÈRE intention que l'activité de lancement.

Ainsi, lorsque l'activité est FERMÉE (terminée) et que l'utilisateur clique sur la notification, il exécute une nouvelle instance de l'activité et getIntent() fonctionne comme prévu (les extras sont pasnull).

Mais si l'activité "dort" (elle est en arrière-plan) et que l'utilisateur clique sur la notification, getIntent() renvoie toujours la toute PREMIÈRE intention qui a démarré l'activité et NON l'intention de notification.

Donc, pour attraper l'intention de notification pendant que l'application est en cours d'exécution, utilisez simplement ceci

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

puis remplacez onNewIntent(Intent newintent).

Ainsi, lorsqu'une application s'exécute pour la première fois, getIntent() peut être utilisée et lorsque l'application sort du mode veille, onNewIntent fonctionne.

113
Magius

Écrivez simplement ce code au-dessus de votre méthode Resume (). C'est tout ce qu'il faut. Cela rafraîchit l'intention - je ne sais pas vraiment, mais cela fonctionne.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
90
coolcool1994

Problème: Vous envoyez le même code de demande pour votre intens en attente. Change ça.

Solution: Définissez la variable globale int UNIQUE_INT_PER_CALL = 0 et lorsque vous créez un appel en attente comme ci-dessous.

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

Comme il semble que votre activité soit déjà en cours d'exécution, je pense que vous devez spécifier FLAG_UPDATE_CURRENT, Sinon l'appel getIntent() renverra le précédent. Voir cette réponse .

3
dmon