Notification click: activité déjà ouverte

J’ai une application avec des notifications qui ouvrent une certaine activité si je clique dessus. Je veux que, si je clique sur la notification et que l’activité est déjà ouverte, elle ne soit pas relancée, mais juste mise au premier plan.

Je pensais pouvoir le faire avec l’indicateur FLAG_ACTIVITY_BROUGHT_TO_FRONT ou FLAG_ACTIVITY_REORDER_TO_FRONT , mais il continue de l’ouvrir à nouveau, j’ai donc l’activité deux fois.

Ceci est mon code:

 event_notification = new Notification(R.drawable.icon, mContext.getSsortingng(R.ssortingng.event_notif_message), System.currentTimeMillis()); Intent notificationIntent = new Intent(mContext, EventListActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); sendNotification(event_notification, notificationIntent, mContext.getSsortingng(R.ssortingng.event_notif_title), body, Utils.PA_NOTIFICATIONS_ID); 

Puis-je le gérer avec des drapeaux ou dois-je stocker une variable dans SharedPreferences pour vérifier si elle est ouverte ou non?

Merci!

Vous devez définir l’atsortingbut launchMode de l’ Activity vous commencez à singleTop . Cela entraînera la dissortingbution des intentions entrantes à l’instance existante au lieu de démarrer une nouvelle instance lorsque cette Activity est déjà en haut de la stack de la tâche.

Cela se fait dans le manifeste en ajoutant android:launchMode="singleTop" à l’élément . Pour accéder à la dernière intention (si vous êtes intéressé par des données qui peuvent lui être transmises), remplacez onNewIntent() dans votre Activity .

Essayez de définir les indicateurs sur Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP place.

À partir de la documentation de FLAG_ACTIVITY_CLEAR_TOP (mise en évidence du mien):

Si elle est définie et que l’activité en cours d’exécution est déjà en cours d’exécution dans la tâche en cours, toutes les autres activités seront fermées au lieu de lancer une nouvelle instance de cette activité et cette intention sera transmise à (maintenant activée). top) ancienne activité en tant que nouvelle intention.

Par exemple, considérons une tâche composée des activités suivantes: A, B, C, D. Si D appelle startActivity () avec une intention qui résout le composant de l’activité B, alors C et D seront terminés et B recevra l’intention donnée , résultant en la stack étant maintenant: A, B.

L’instance en cours d’exécution de l’activité B dans l’exemple ci-dessus recevra soit la nouvelle intention que vous commencez ici dans sa méthode onNewIntent (), soit sera elle-même terminée et redémarrée avec la nouvelle intention. S’il a déclaré que son mode de lancement est “multiple” (valeur par défaut) et que vous n’avez pas défini FLAG_ACTIVITY_SINGLE_TOP dans le même but, il sera alors terminé et recréé; pour tous les autres modes de lancement ou si FLAG_ACTIVITY_SINGLE_TOP est défini, cette intention sera transmise à onNewIntent () de l’instance actuelle.

Utilisez onNewIntent() pour gérer les nouvelles données à partir de la notification cliquez sur et actualisez l’activité.

Dans onNewIntent récupérez les nouvelles données de la nouvelle intention (qui servait par la nouvelle notification) et récupérez-les, par exemple:

title = intent.getSsortingngExtra("title")

dans onCreate précédemment 🙂

Il actualisera l’activité actuelle avec de nouvelles données de notification.

Vous pouvez également suivre ce tutoriel: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/

 Notification.Builder mBuilder = new Notification.Builder(this) .setSmallIcon(R.drawable.cmplayer) .setContentTitle("CoderoMusicPlayer") .setContentText("PLayer0!"); Intent resultIntent = new Intent(this, AndroidBuildingMusicPlayerActivity.class); resultIntent.setAction(Intent.ACTION_MAIN); resultIntent.addCategory(Intent.CATEGORY_LAUNCHER); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); mBuilder.setContentIntent(pendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager.notify(1, mBuilder.build()); 

Copiez simplement le code et collez-le dans votre activité principale de lanceur.

Voici la réponse originale

 Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent contentIntent = PendingIntent.getActivity(this, new Random().nextInt(), intent, 0); 

Je pense que vous devriez append un peu de logique pour que cela fonctionne, peut-être que cela peut aider:

Par exemple, j’ai un écran de démarrage (Launcher et MAIN) de l’application:

 public class SplashScreen extends AppCompatActivity { private final int TIME_OUT = 2000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash_screen); // Suscribirse al tema Notificaciones FirebaseMessaging.getInstance().subscribeToTopic("NOTA"); if (getIntent().getExtras() != null) { if (getIntent().getExtras().size()>1){ Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (getIntent().getExtras() != null) { for (Ssortingng key : getIntent().getExtras().keySet()) { Ssortingng value = "" + getIntent().getExtras().getSsortingng(key); Log.d("TAG", key + "=" + value); switch (key) { case "url": home_activity.putExtra("url", value); break; } } } startActivity(home_activity); finish(); }else{ new Handler().postDelayed(new Runnable() { @Override public void run() { try { Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(home_activity); finish(); } catch (Exception ex) { ex.printStackTrace(); } } }, TIME_OUT); } } else { new Handler().postDelayed(new Runnable() { @Override public void run() { try { Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(home_activity); finish(); } catch (Exception ex) { ex.printStackTrace(); } } }, TIME_OUT); } } } 

Et dans mon FirebaseService, j’ai fait ce qui suit:

 public class FCMessagingService extends FirebaseMessagingService { private final Ssortingng TAG = "PUSH"; private Ssortingng body = ""; private static Ssortingng _url = ""; private static int numMessage = 0; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); Ssortingng from = remoteMessage.getFrom(); Log.d(TAG, "Mensaje recibido de: " + from); if (remoteMessage.getNotification() != null) { Log.d(TAG, "Notificación: " + remoteMessage.getNotification().getBody()); if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Data: " + remoteMessage.getData()); try { JSONObject data = new JSONObject(remoteMessage.getData()); Ssortingng url = data.getSsortingng("url"); Log.d(TAG, "onMessageReceived: \n" + "Extra Information: " + url); this._url = url; Log.d("_URL",_url); mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); mensaje(url, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); } catch (JSONException e) { e.printStackTrace(); } } } } private void mensaje(Ssortingng url, Ssortingng title, Ssortingng body){ boolean acti = Util.comprobarActivityALaVista(getApplicationContext(), "com.dev.android.subagan.MainActivity"); if(acti){ Intent imain = new Intent(MainActivity.URL); imain.putExtra("key_url",url); imain.putExtra("key_title",title); imain.putExtra("key_body",body); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(imain); }else{ Intent ihome = new Intent(Home.URL); ihome.putExtra("key_url",url); ihome.putExtra("key_title",title); ihome.putExtra("key_body",body); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(ihome); } } private void mostrarNotificacion(Ssortingng title, Ssortingng body) { final int NOTIFICATION_ID = 3000; Intent intent = new Intent(this, MainActivity.class); intent.putExtra("url",_url); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT ); Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(body) .setAutoCancel(true) .setSound(soundUri) .setTicker(body) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); } }