Jump to content

Revenir à une activity depuis les notifications


gedeon555

Recommended Posts

Bonjour,

Je stoque un id d'instance dans mon activity qui balance une notification. J'aimerais que lorsque l'utilisateur clique sur la notification, il retourne dans l'activity et que l'id soit conservé.

Voici un bout de code pour comprendre :

public class MyActivity extends Activity {
 private long intentId = 0;

 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   Log.d("TEST", String.valueOf(intentId));
   if (intentId == 0) {
     intentId = System.currentTimeMillis();
     setContentView(R.layout.My);
     .......
   }
 }

 public void createNotification() {

   NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
   Notification notification = new Notification(
     R.drawable.icon, 
     "Notification", 
     System.currentTimeMillis());

   notification.setLatestEventInfo(this,
   "Notification", "test", PendingIntent
     .getActivity(this, 0, getIntent(), PendingIntent.FLAG_UPDATE_CURRENT));

   mNotificationManager.notify((int) intentId, notification);
 }
}

Le comportement que j'obtiens avec ca est que dans mes logs, l'intentId vaut toujours 0 au moment ou je l'affiche.

Link to comment
Share on other sites

Tiens, prend ma fonction:

   public static void showNotification(String title, String text, String ticker, Context context, int number) {
       NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

       int icon = R.drawable.notification;

       CharSequence tickerText = ticker;
       long when = System.currentTimeMillis();

       Notification notification = new Notification(icon, tickerText, when);

       //notification.flags |= Notification.FLAG_ONGOING_EVENT;
       //notification.number = temp;
       notification.number = number;
       //Context context = getApplicationContext();
       CharSequence contentTitle = title;
       CharSequence contentText = text;
       Intent notificationIntent = new Intent(context, TouiteurMain.class);
       notificationIntent.setAction(Intent.ACTION_MAIN);
       notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

       notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

       final int T_ID = 999;

       notificationManager.notify(T_ID, notification);
   }    

T'auras juste a remplacer "TouiteurMain.class" par la classe que tu veux qu'il lance (la classe de ton activity)

Edit: j'avais pas vu que tu voulais renvoyer une info. T'as juste a rajouter une info a l'intent notificationIntent

Style notificationIntent.putExtra("Nom", "Toto");

et dans ton onCreate de ton Activity tu recuperes cette info avec getIntent().getExtras().getString("Nom");

Ca marche avec les long et les int sans problemes, suffit de faire getLong ou getInt

Edited by Tama Chan
Link to comment
Share on other sites

  • 1 year later...

J'ai la même erreur et j'ai aussi une méthode permettant la création de ma notification. j'ai aussi utilisé ton code mais quand je click sur ma notification, cela relance une autre instance de mon application.

Voici mon code source :

	public void triggerNotification(boolean create, String notification_title, String chan_title, String chan_song) {
   	if (create == true) {
   		int icon = R.drawable.icon;        									// icon from resources
   		CharSequence tickerText = notification_title;						// ticker-text
   		long when = System.currentTimeMillis();         					// notification time
   		Context context = theContext.getApplicationContext(); 				// application Context
   		CharSequence contentTitle = chan_title; 							// expanded message title
   		CharSequence contentText = chan_song;     							// expanded message text

   		Intent notificationIntent = new Intent(theContext, PulsDroid.class);
   		notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
   		PendingIntent pendingIntent = PendingIntent.getActivity(theContext, 0, notificationIntent, 0);

   		// the next two lines initialize the Notification, using the configurations above
   		Notification notification = new Notification(icon, tickerText, when);
   		notification.setLatestEventInfo(context, contentTitle, contentText, pendingIntent);

   		notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
           notification.flags |= Notification.FLAG_NO_CLEAR;
           notification.flags |= Notification.FLAG_ONGOING_EVENT;
           notificationManager.notify(NOTIFICATION_ID, notification);

   	}
   	else {
   		notificationManager.cancel(NOTIFICATION_ID);
   	}
   }

Edited by emulienfou
Link to comment
Share on other sites

Je pense qu'il ne faut pas que tu mettes le flag FLAG_ACTIVITY_NEW_TASK, si tu veux réutiliser une Activity déjà existante

 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Link to comment
Share on other sites

Merci pour ton aide, cela ne fonctionne toujours pas mais j'ai remarqué que si j’appuie sur la touche "Accueil" de mon téléphone, et que je clic sur ma notification, cela fonctionne mais si je clic sur le bouton "Retour" alors cela lancera une nouvelle activité !!

J'ai aussi le message suivant dans mon LogCat : WARN/ActivityManager(174): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK

Link to comment
Share on other sites

Bon, ben, visiblement, il ne faut pas enlever FLAG_ACTIVITY_NEW_TASK, j'ai dit une carabistouille

Donc, si je résume:

appui sur Home, puis sélection de la notification=> ça marche : c'est normal !

appui sur Retour, puis sélection de la notification => nouvelle instance de ton Activity : c'est normal aussi, vu que le bouton retour a pour effet de fermer l'Activity

Donc, il n'y avait de problèmes à l'origine ;)

Link to comment
Share on other sites

  • 4 years later...

Bonjour,

  Mon sujet est le même mais j'ai des soucis avec setLatestEventInfo qui n'est pas reconnu. Je suis tout novice en dev android et je cherche pas mal mes marques..

 Pour l'instant mon programme est simple (histoire de me familiariser avec l'environnement) j'ai une classe Notifications:

package sousdev.notifications;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Notifications extends AppCompatActivity {

    @[member=override]
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView text = new TextView(this);

        long yourmilliseconds = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm");
        Date resultdate = new Date(yourmilliseconds);
        text.setText(sdf.format(resultdate));
        setContentView(text);
        createNotification("titre", "Message");
        //showNotification("titre", "Message", "Ticker",this,0);
    }

    private void createNotification(String titre,String message){
        NotificationManager mNotification = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Intent launchNotifiactionIntent = new Intent(this, InfoNotif.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0, launchNotifiactionIntent,PendingIntent.FLAG_ONE_SHOT);
        Notification.Builder builder = new Notification.Builder(this)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.icone)
                .setContentTitle(titre)
                .setContentText(message)
                .setContentIntent(pendingIntent);
        mNotification.notify(0, builder.build());
    }
}

Celle-ci se charge au démarrage et crée une notification. Et je cherche a faire en sorte que lorsqu'on clique sur cette notif, que la seconde classe : InfoNotif s'ouvre:

package sousdev.notifications;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/**
 * Created by david on 31/03/2016.
 */
public class InfoNotif extends AppCompatActivity {
    @[member=override]
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CreateButton("Test");
    }
    private void CreateButton(String message)
    {
        Button b=new Button(this);
        b.setText(message);
        setContentView(b);
    }
}

Mon soucis est que l'application se lance bien, la notification se crée bien mais lorsque je clique dessus.. bah rien ne se passe.

Auriez vous une idée?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...