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);
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>
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!
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
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):
MainActivity
au lieu de MatchActivity
, en passant MatchActivity
comme argument (par intention).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)));
}
...
}
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);
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.
Vous devriez ajouter ceci à MainActivity sur le Manifest Android:
<activity
Android:name=".MainActivity"
Android:allowTaskReparenting="true" />
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).
cela peut aussi arriver si votre activité dans manifest a ensuite launchMode :
<activity Android:name=".SecondActivity"
...
Android:launchMode="singleInstance"
Android:parentActivityName=".MainActiviy"
...
/>
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.
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);