web-dev-qa-db-fra.com

Intention de reprendre une activité précédemment mise en pause (Appelé à partir d'une notification)

Je développe une application qui affiche une notification à l'utilisateur. L'objectif de la notification est de permettre à l'utilisateur de revenir facilement à l'activité lorsqu'il est dans une autre activité. J'utilise ce code dans mon application pour créer et afficher la notification.

                    notification = new Notification(R.drawable.icon,
                            "Notify",
                            System.currentTimeMillis());
                    notification.setLatestEventInfo(this, "App name",
                            "App message",
                            PendingIntent.getActivity(
                                    this, 0,
                                    new Intent(this, Main.class),
                                    PendingIntent.FLAG_CANCEL_CURRENT));
                    notification.flags |= Notification.FLAG_ONGOING_EVENT;
                    nManager.notify(0, notification);

Mais lorsque l'utilisateur appuie sur la notification, une nouvelle instance de la même activité est lancée, au lieu de celle que l'utilisateur utilisait auparavant.

Je pense que cela a quelque chose à voir avec PendingIntent mais je ne trouve pas comment faire pour que cet Intention reprenne une instance de l'activité précédemment suspendue au lieu de créer une nouvelle instance.

Merci.

21
Jimix

J'ai découvert comment faire. J'ai ajouté le code suivant:

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Maintenant, mon code ressemble à ceci:

    notification = new Notification(R.drawable.icon,
            "Notify", System.currentTimeMillis());
    notification.setLatestEventInfo(this, "App name",
            "App message", PendingIntent.getActivity(this,
                    0, new Intent(this, Main.class)
                            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                                    | Intent.FLAG_ACTIVITY_SINGLE_TOP),
                    PendingIntent.FLAG_CANCEL_CURRENT));
    notification.flags |= Notification.FLAG_ONGOING_EVENT;
22
Jimix

Cela aide pour moi Android:launchMode="singleInstance"

<activity
        Android:name="com.mosis.automatskidnevnik.MainActivity"
        Android:launchMode="singleInstance"
        Android:label="@string/app_name" >
        ...
9
Zeljko Ivanovic

J'ai résolu le même problème en mettant

Android:launchMode="singleTask"
1
Abhishek Jaiswal

Mis à part la réponse correcte de @Jimix, je changerais la PendingIntentrequestCode de 0 à un non nul valeur comme commenté sur un autre réponse . D'autre part, il y a un bug connu sur les versions précédentes d'Android qui m'a pris quelques heures désespérées. La solution proposée a bien fonctionné pour moi en annulant la PendingIntent avant d'envoyer la notification:

if (Build.VERSION.SDK_INT == 19) {
   getNotificationPendingIntent().cancel();
}
0
GoRoS

Lors de la création de votre PendingIntent, vous utilisez:

Main.this.getBaseContext ()

Vous devez utiliser le contexte d'activité par défaut si vous souhaitez revenir à la même activité. Lire la suite ici:

Android - Quelle est la différence entre les différentes méthodes pour obtenir un contexte?

0
Yossi