web-dev-qa-db-fra.com

L'intention de la notification n'a pas d'extras

Cela semble être un problème courant et j'ai parcouru toutes les questions que je pouvais déjà trouver: L'activité ne détecte pas la nouvelle intention , Pourquoi des données supplémentaires (entier) ne sont pas envoyées dans la notification Android intention? , La notification passe aux anciens suppléments d'intention , Impossible de mettre des suppléments pour une intention dans la notification , Problème de notification d'intention en attente sous Android ; mais ne peut toujours pas comprendre cela.

Le problème est le même. Je règle une notification avec un PendingIntent contenant des informations supplémentaires et je ne les reçois pas de l'autre côté.

Voici le code pour générer la notification:

Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;

Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);

Et de l'autre côté:

boolean start_test=getIntent().getBooleanExtra("start_test", false);

Le paquet n’est pas réellement là (getExtras () renvoie null).

J'ai essayé les différents drapeaux pour PendingIntent.getActivity (FLAG_UPDATE_CURRENT, FLAG_CANCEL_CURRENT, FLAG_ONE_SHOT), aucun de ceux aidés.

Comme indiqué dans le code, j'utilise getCurrentMillis pour m'assurer que l'ID de requête change.

Nous avons également constaté que, dans MyActivity, onCreate et onNewIntent n'étaient pas appelés. seul onResume est. Même si le FLAG_ACTIVITY_NEW_TASK est défini ...?

Est-ce que je manque quelque chose de très simple?

38
Matthieu

La définition de FLAG_ACTIVITY_NEW_TASK pour l'intention de notification entraînera les problèmes suivants:

  • Si l'activité est non déjà en cours d'exécution dans une tâche, une nouvelle tâche sera lancée et l'intention sera transmise à l'activité dans onCreate().

  • Toutefois, si l'activité est déjà en cours d'exécution dans une tâche, cette tâche sera mise au premier plan. C'est tout. L'intention sera pas _ livrée et onNewIntent() ne sera pas appelé.

Si vous souhaitez que l'intention soit effectivement livrée, vous devez spécifier:

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

Que aucune différence soit _ que launchMode de l'activité soit singleTop ou non, vous devez toujours spécifier Intent.FLAG_ACTIVITY_SINGLE_TOP dans l'intention.

Remarque: Si l'activité est déjà en cours d'exécution dans une tâche et que l'activité est pas au-dessus de la pile d'activités de cette tâche, la tâche sera mise au premier plan. C'est tout. L'intention sera pas être livrée. La seule façon d'y parvenir serait d'ajouter Intent.FLAG_ACTIVITY_CLEAR_TOP aux 2 autres drapeaux, mais ce n'est peut-être pas ce que vous voulez (cela dépend de votre scénario).

Voir mon numéro (toujours) ouvert sur le code Google à l'adresse suivante: http://code.google.com/p/Android/issues/detail?id=17137

46
David Wasser

Je viens d'ajouter l'indicateur PendingIntent.FLAG_UPDATE_CURRENT à mon intention en attente et cela a commencé à fonctionner pour moi (ignoré tous les indicateurs pour l'intention).

Exemple de code:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
34
codingjeremy
  1. Si vous n'en avez pas besoin, evitez et définissez votre activité dans le manifeste comme une tâche unique. omettez cette ligne ou changez-la en singleTop si vous pouvez:

      Android:launchMode="singleTask”
    
  2. Si vous devez avoir une seule tâche, alors en attente d'intention, définissez des indicateurs sur: Intention .FLAG_ACTIVITY_NEW_TASK | Intention .FLAG_ACTIVITY_CLEAR_TASK Et PendingIntent .FLAG_CANCEL_CURRENT.

    resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
    pIntent = PendingIntent.getActivity(context, 0, resultIntent,    PendingIntent.FLAG_CANCEL_CURRENT );
    
  3. Si vous n'avez qu'une seule tâche - Réinitialisez vos extras dans votre activité dans onNewIntent () by setIntent (intent);

    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    
4
Udi Reshef

Approche plus simple: le vrai problème est que l’intention, étant vis-à-vis de la même cible, est remplacée. J'ai résolu ce problème en créant un nouveau service, un "NotificationDismissalService". La seule intention allant à ce service est l'élément setDeleteIntent. Parce que c'est un service unique, les paramètres ne sont pas remplacés. Le corps de NotificationDismissalService (et ce serait vraiment un tel service de renvoi par type d'intention unique) est une implémentation simple de "onStartCommand" qui envoie une intention au service préféré (lecture/écriture des paramètres corrects). Comme il s’agit d’un envoi de service, sans appel en attente entre les deux, cela fonctionne parfaitement.

0
user1676075

J'ai utilisé quelque chose comme ça 

Intent myIntent = new Intent(context, DoSomething.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        Intent.FLAG_ACTIVITY_NEW_TASK);

Découvrez l'exemple complet ici

0
Panayiotis Georgiou

Vous pouvez envoyer des extras de la manière suivante

PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

stackBuilder.addParentStack(ArticleDetailedActivity.class);

contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

Pour obtenir une valeur supplémentaire d'intention dans la classe d'activité de test, vous devez écrire le code suivant:

Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;
0
mohit