Comment envoyer des paramètres à partir d'une notification – cliquez sur une activité?

Je peux trouver un moyen d'envoyer des paramètres à mon activité à partir de ma notification.

J'ai un service qui crée une notification. Lorsque l'utilisateur clique sur la notification, je souhaite ouvrir mon activité principale avec certains paramètres spéciaux. Par exemple, un identifiant d'élément, donc mon activité peut charger et présenter une vue détaillée des éléments spéciaux. Plus précis, je télécharge un fichier et, lorsque le fichier est téléchargé, je souhaite que la notification ait l'intention que lorsque vous cliquez dessus, j'ouvre mon activité en mode spécial. J'ai essayé d'utiliser putExtra sur mon intention, mais je ne peux pas l'extraire, alors je pense que je le fais mal.

  • Lancez une application Android personnalisée à partir du navigateur Android
  • Notifications en temps spécifique tous les jours, Android
  • Comment ajouter un bouton aux notifications dans Android?
  • Aucun signal de notification lors de l'envoi de la notification de la base de données de fire-android
  • Mode fiable de récupération des détails StatusbarNotification (titre, texte de notification)
  • L'image de Facebook en tant que grande icône La notification apparaît comme blanche sur différents téléphones?
  • Code de mon service qui crée la notification:

      // construct the Notification object. final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis()); final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout); contentView.setImageViewResource(R.id.image, R.drawable.icon); contentView.setTextViewText(R.id.text, tickerText); contentView.setProgressBar(R.id.progress,100,0, false); notif.contentView = contentView; Intent notificationIntent = new Intent(context, Main.class); notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notif.contentIntent = contentIntent; nm.notify(id, notif); 

    Code de mon activité qui essaie d'extraire le paramètre supplémentaire de la notification:

      public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Bundle extras = getIntent().getExtras(); if(extras != null){ Log.i( "dd","Extra:" + extras.getString("item_id") ); } 

    Les extras sont toujours nulles et je n'ai jamais rien dans mon journal.

    Btw … l' onCreate n'est exécuté que lorsque mon activité commence, si mon activité est déjà lancée, je souhaite également collecter les extras et présenter mon activité en fonction de l'item_id que je reçois.

    Des idées?

    11 Solutions collect form web for “Comment envoyer des paramètres à partir d'une notification – cliquez sur une activité?”

    Jetez un oeil à ce guide (en créant une notification ) et aux échantillons ApiDemos "StatusBarNotifications" et "NotificationDisplay".

    Pour gérer si l'activité est déjà en cours d'exécution, vous avez deux façons:

    1. Ajoutez le drapeau FLAG_ACTIVITY_SINGLE_TOP à l'intention lors du lancement de l'activité, puis, dans la classe d'activité, mettez en œuvre le gestionnaire d'événements NewWenttent (intention intention) , de cette façon vous pouvez accéder à la nouvelle intention qui a été appelée pour l'activité (ce qui n'est pas le même que d'appeler getIntent (), Cela renverra toujours la première intention qui a lancé votre activité.

    2. Identique au numéro un, mais au lieu d'ajouter un drapeau à l'intention, vous devez ajouter "singleTop" dans votre activité AndroidManifest.xml.

    Si vous utilisez des extras intentionnels, PendingIntent.getActivity() vous pour appeler PendingIntent.getActivity() avec le drapeau PendingIntent.FLAG_UPDATE_CURRENT , sinon les mêmes extras seront réutilisés pour chaque notification.

    J'ai eu le problème similaire, ma demande affiche les notifications de message. Lorsqu'il y a plusieurs notifications et que vous cliquez sur chaque notification, vous affichez ce détail de notification dans une activité de message de vue. J'ai résolu le problème des mêmes paramètres supplémentaires qui sont reçus dans l'intention du message d'affichage.

    Voici le code qui l'a corrigé. Code pour la création de l'intention de notification.

      Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class); notificationIntent.putExtra("NotificationMessage", notificationMessage); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent); 

    Code pour afficher l'activité de message.

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onNewIntent(getIntent()); } @Override public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); if(extras != null){ if(extras.containsKey("NotificationMessage")) { setContentView(R.layout.viewmain); // extract the extra-data in the Notification String msg = extras.getString("NotificationMessage"); txtView = (TextView) findViewById(R.id.txtMessage); txtView.setText(msg); } } } 

    Peut-être un peu en retard, mais: au lieu de cela:

     public void onNewIntent(Intent intent){ Bundle extras = intent.getExtras(); Log.i( "dbg","onNewIntent"); if(extras != null){ Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol")); Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol")); } mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS); } 

    Utilisez ceci:

     Bundle extras = getIntent().getExtras(); if(extras !=null) { String value = extras.getString("keyName"); } 

    Encounter le même problème ici. Je le résolus en utilisant le code de demande différent, j'utilise le même identifiant que la notification, tout en créant PendingIntent. Mais ne savent toujours pas pourquoi cela devrait être fait.

     PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0); notif.contentIntent = contentIntent; nm.notify(**id**, notif); 

    Après avoir lu des listes de courrier électronique et d'autres forums, j'ai trouvé que l'astuce semble ajouter des données uniques à l'intention.

    comme ça:

      Intent notificationIntent = new Intent(Main.this, Main.class); notificationIntent.putExtra("sport_id", "sport"+id); notificationIntent.putExtra("game_url", "gameURL"+id); notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

    Je ne comprends pas pourquoi cela doit être fait, il a quelque chose à voir avec l'intention ne peut être identifié que par ses extras …

    J'ai tout essayé, mais rien ne fonctionnait.

    A finalement eu la solution suivante.

    1- dans manifeste ajouter pour l'activité android: launchMode = "singleTop"

    2- tout en faisant l'intention en attente de faire ce qui suit, utilisez le faisceau au lieu d'utiliser directement intention.putString () ou intention.putInt ()

      Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class); Bundle bundle = new Bundle(); bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId())); bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId()); bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl()); notificationIntent.putExtras(bundle); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), new Random().nextInt(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    AndroidManifest.xml

    Inclure launchMode = "singleTop"

     <activity android:name=".MessagesDetailsActivity" android:launchMode="singleTop" android:excludeFromRecents="true" /> 

    SMSReceiver.java

    Définissez les drapeaux pour l'intention et l'intention en attente

     Intent intent = new Intent(context, MessagesDetailsActivity.class); intent.putExtra("smsMsg", smsObject.getMsg()); intent.putExtra("smsAddress", smsObject.getAddress()); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    MessageDetailsActivity.java

    OnResume () – reçoit chaque fois, charge les extras.

     Intent intent = getIntent(); String extraAddress = intent.getStringExtra("smsAddress"); String extraBody = intent.getStringExtra("smsMsg"); 

    J'espère que cela contribue, il a été basé sur d'autres réponses ici sur stackoverflow, mais c'est la plus mise à jour qui a fonctionné pour moi.

    C'est facile, c'est ma solution à l'aide d'objets!

    Mon POJO

     public class Person implements Serializable{ private String name; private int age; //get & set } 

    Notification de méthode

      Person person = new Person(); person.setName("david hackro"); person.setAge(10); Intent notificationIntent = new Intent(this, Person.class); notificationIntent.putExtra("person",person); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.notification_icon) .setAutoCancel(true) .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos)) .setPriority(2) .setLargeIcon(bm) .setTicker(fotomulta.getTitle()) .setContentText(fotomulta.getMessage()) .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setWhen(System.currentTimeMillis()) .setContentTitle(fotomulta.getTicketText()) .setDefaults(Notification.DEFAULT_ALL); 

    Nouvelle activité

      private Person person; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notification_push); person = (Person) getIntent().getSerializableExtra("person"); } 

    Bonne chance!!

    Après avoir fait une recherche, j'ai une solution du guide de développement Android

     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 dans la classe d'activité de test, vous devez écrire le code suivant:

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

    Si tu utilises

     android:taskAffinity="myApp.widget.notify.activity" android:excludeFromRecents="true" 

    Dans votre fichier AndroidManifest.xml pour l'activité à lancer, vous devez utiliser ce qui suit dans votre intention:

     Intent notificationClick = new Intent(context, NotifyActivity.class); Bundle bdl = new Bundle(); bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem); notificationClick.putExtras(bdl); notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); // schließt tasks der app und startet einen seperaten neuen TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(NotifyActivity.class); stackBuilder.addNextIntent(notificationClick); PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(notificationPendingIntent); 

    Il est important de définir des données uniques, par exemple en utilisant un identifiant unique comme:

     notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId())); 

    Pour les services, utilisez PendingIntent.FLAG_UPDATE_CURRENT

    Pour moi travailler.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.