web-dev-qa-db-fra.com

Android - Créer une notification, TaskStackBuilder.addParentStack ne fonctionne pas

J'essaie de lancer une activité à partir d'une notification telle que l'expliquent les documents Android, mais lorsque j'ouvre la notification puis que j'appuie sur le bouton Précédent, HomeActivity (parent) ne s'ouvre pas, mais l'application se ferme. Qu'est-ce que je fais mal?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);
47
David Fortunato

Vous devez ajouter la pile parente pour l'activité que vous lancez, pas son parent.

Remplacer:

stackBuilder.addParentStack(MainActivity.class);

avec:

stackBuilder.addParentStack( MatchActivity.class );

Cela suppose que vous avez défini le parent dans votre manifeste (API 16+):

<activity Android:name=".MatchActivity"
    Android:parentActivityName=".MainActivity"
    ... />

Si vous développez sous l'API 16, vous devez définir le parent comme suit:

<activity Android:name=".MatchActivity">
    <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value=".MainActivity" />
</activity>
90
Ralgha

Si aucune des solutions ne fonctionne et que vous êtes sûr d'avoir tout suivi de près ... alors vous avez besoin de vous désinstaller l'application et réinstaller il . A travaillé pour moi!

63
penduDev
Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);

cela a résolu mon problème avec la pile parente sur le clic de notification

8
Rafael

Utiliser TaskStackBuilder n'a pas résolu mon problème et ne fonctionne que pour Honeycomb et ses versions supérieures. Alors je prends la solution suivante (s'il vous plaît, ne me crucifiez pas):

  1. Appelez MainActivity au lieu de MatchActivity, en passant MatchActivity comme argument (par intention).
  2. Dans MainActivity.onCreate, démarrez la MatchActivity si le paramètre est disponible.

Nouveau code:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
            .setContentIntent(pendingIntent) //
            .build();

Sur MainActivity:

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
        startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
    }
    ...
}
7
Italo Borssatto

Pour moi, stackBuilder.addParentStack ne fonctionnait pas.

Je finis par faire cela, en espérant que cela puisse vous aider.

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
3
Pablo

Avez-vous consulté la documentation Android, en particulier le Notifications API guide. Il décrit comment procéder en détail.

Notez que si l'activité que vous démarrez à partir de la notification ne fait pas partie du flux d'activité normal, elle ne devrait pas accéder à la page de démarrage de l'application; au lieu de cela, il devrait aller à l'écran d'accueil.

2
Joe Malin

Vous devriez ajouter ceci à MainActivity sur le Manifest Android:

<activity
   Android:name=".MainActivity"
   Android:allowTaskReparenting="true" />
1
Rafa0809

Comme indiqué dans d'autres réponses, TaskStackBuilder ne fonctionne pas pour les versions inférieures à Honeycomb.

Ma solution consistait à remplacer la méthode onBackPressed() de l'activité.

@Override
public void onBackPressed() {
    NavUtils.navigateUpFromSameTask(this);
}

De toute évidence, si vous avez l'intention de terminer l'activité d'une autre manière, vous devrez également vous en charger. (J'imagine que surcharger finish() aura un comportement inattendu).

1
kassim

cela peut aussi arriver si votre activité dans manifest a ensuite launchMode :

<activity Android:name=".SecondActivity"
     ...
         Android:launchMode="singleInstance"
         Android:parentActivityName=".MainActiviy"
    ...
/>
0
Andriy Antonov

Si vous utilisez la génération de code dans votre projet (comme Dagger), MainActivity.class doit être remplacé par MainActivity_.class (ou quel que soit le nom de votre activité parent). Il m'a fallu une journée entière pour comprendre cela. J'espère que cela peut sauver la journée de quelqu'un.

0
Mykola

J'ai eu le même problème! Résoudre:

basculer vers

PendingIntent resultPendingIntent = 

PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
0
Joelder