144 votes

Intention - si l'activité est en cours, ramenez-la à l'avant-plan, sinon démarrez une nouvelle (à partir de la notification)

Mon application a des notifications, qui - évidemment - sans aucun drapeau, lancent une nouvelle activité à chaque fois, donc j'obtiens plusieurs activités identiques qui s'exécutent les unes par-dessus les autres, ce qui est tout simplement incorrect.

Ce que je veux qu'il fasse, c'est d'amener l'activité spécifiée dans l'intent en attente de notifications, à l'avant s'il est déjà en cours d'exécution, sinon de le démarrer.

Jusqu'à présent, l'intent/l'intent en attente pour cette notification que j'ai est

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

et étrangement, parfois ça fonctionne, parfois ça ne fonctionne pas... J'ai l'impression d'avoir déjà essayé toutes les combinaisons de drapeaux possibles.

3voto

nada Points 1319

J'ai essayé cela et ça a fonctionné même si l'IDE se plaignait du code

Intent notificationIntent = new Intent(CETTE_CONTEXTE, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent intent = PendingIntent.getActivity(CETTE_CONTEXTE, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(CETTE_CONTEXTE)
            .setSmallIcon(R.drawable.cast_ic_notification_0)
            .setContentTitle("Titre")
            .setContentText("Contenu")
            .setContentIntent(intent)
            .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5;
            .setAutoCancel(true)
            /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/;
    NotificationManager mNotificationManager = (NotificationManager) CETTE_CONTEXTE.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());

2voto

Fat Shogun Points 86

Comme vous dites que vous voulez démarrer votre activité si elle n'est pas déjà démarrée, peut-être ne vous importe-t-il pas de la redémarrer. J'ai testé une tonne de suggestions et de combinaisons de drapeaux pour l'intention également, cela mettra toujours l'activité dont vous avez besoin au premier plan, bien qu'elle ne conserve pas l'état précédemment associé.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

Uniquement pour API11+.

2voto

gattsbr Points 190

J'ai rencontré un problème similaire après avoir ajouté des notifications telles que décrites sur le site de formation Android. Aucune des autres réponses ici n'a fonctionné pour moi, cependant cette réponse a fonctionné pour moi. Résumé :

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X