Lorsque vous démarrez une activité à partir d'une notification, vous devez conserver les expérience de navigation attendue. Appuyer sur le bouton Retour doit faire revenir l'utilisateur le flux de travail normal de l'application jusqu'à l'écran d'accueil, puis en ouvrant la page l'écran doit afficher l'activité en tant que tâche distincte. Pour conserver cette navigation démarrer l'activité dans une nouvelle tâche.
L'approche de base pour définir le comportement d'appui sur une notification est décrite dans la section
Créer un tableau de bord
notification.
Cette page explique comment configurer un
PendingIntent
pour votre
l'action d'une notification afin qu'elle crée une tâche nouvelle et une nouvelle
pile. Comment procéder ?
dépend du type d'activité que vous démarrez:
- Activité régulière
- Il s'agit d'une activité qui fait partie du flux d'expérience utilisateur normal de votre application. Quand ? l'utilisateur arrive dans l'activité à partir de la notification, la nouvelle tâche doit inclure une pile "Retour" complète, ce qui permet à l'utilisateur d'appuyer sur le bouton Retour pour naviguer dans la hiérarchie de l'application.
- Activité spéciale
- L'utilisateur ne voit cette activité que si elle a été lancée à partir d'une notification. Dans un cette activité étend l'UI des notifications en fournissant des informations dans la notification elle-même. Cette activité n'a pas besoin pile "Retour".
Configurer un PendingIntent d'activité standard
Pour démarrer une activité standard à partir de la notification, configurez le PendingIntent
avec TaskStackBuilder
afin de créer une pile "Retour" comme suit.
Définir la hiérarchie des activités de votre application
Définissez la hiérarchie naturelle de vos activités en ajoutant le paramètre
android:parentActivityName
à chaque <activity>
dans le fichier manifeste de votre application. Consultez l'exemple suivant :
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- MainActivity is the parent for ResultActivity. --> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity" /> ... </activity>
Créer un PendingIntent avec une pile "Retour"
Pour démarrer une activité qui inclut une pile "Retour" d'activités, créez une
une instance de TaskStackBuilder
et appeler
addNextIntentWithParentStack()
,
en lui transmettant le Intent
l'activité que vous
souhaitez commencer.
Tant que vous définissez l'activité parente pour chaque activité, comme décrit
auparavant, vous pouvez appeler
getPendingIntent()
pour recevoir un PendingIntent
incluant l'intégralité de la pile "Retour".
// Create an Intent for the activity you want to start. val resultIntent = Intent(this, ResultActivity::class.java) // Create the TaskStackBuilder. val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run { // Add the intent, which inflates the back stack. addNextIntentWithParentStack(resultIntent) // Get the PendingIntent containing the entire back stack. getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) }
// Create an Intent for the activity you want to start. Intent resultIntent = new Intent(this, ResultActivity.class); // Create the TaskStackBuilder and add the intent, which inflates the back // stack. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addNextIntentWithParentStack(resultIntent); // Get the PendingIntent containing the entire back stack. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Si nécessaire, vous pouvez ajouter des arguments aux objets Intent
de la pile en appelant
TaskStackBuilder.editIntentAt()
Cela est parfois nécessaire pour s'assurer qu'une activité dans la pile "Retour"
affiche des données pertinentes lorsque l'utilisateur y accède.
Vous pouvez ensuite transmettre PendingIntent
à la notification comme d'habitude:
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(resultPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Configurer un PendingIntent d'activité spéciale
Parce qu'une activité spéciale qui commence par une notification n'a pas besoin d'être posée
la pile, vous pouvez créer le PendingIntent
en appelant
getActivity()
Toutefois, définissez les options de tâche appropriées dans le fichier manifeste.
-
Dans votre fichier manifeste, ajoutez les attributs suivants au fichier
Élément
<activity>
.-
android:taskAffinity=""
-
Combiné avec le
FLAG_ACTIVITY_NEW_TASK
que vous utilisez dans le code, laissez cet attribut vide pour vous assurer cette activité n'entre pas dans la tâche par défaut de l'application. N'importe quelle valeur les tâches existantes qui présentent l'affinité par défaut de l'application concernés. -
android:excludeFromRecents="true"
- Exclut la nouvelle tâche de l'écran "Recents" (Éléments récents) afin que l'utilisateur vous ne pourrez pas y revenir accidentellement.
Ce processus est illustré dans l'exemple suivant :
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
-
Créez et émettez la notification:
<ph type="x-smartling-placeholder">
- </ph>
-
Créez un élément
Intent
qui lance leActivity
-
Définissez
Activity
pour qu'il démarre dans une nouvelle tâche vide en Appel en courssetFlags()
avec les optionsFLAG_ACTIVITY_NEW_TASK
etFLAG_ACTIVITY_CLEAR_TASK
-
Créez un
PendingIntent
en appelantgetActivity()
Ce processus est illustré dans l'exemple suivant :
val notifyIntent = Intent(this, ResultActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
Intent notifyIntent = new Intent(this, ResultActivity.class); // Set the Activity to start in a new, empty task. notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Create the PendingIntent. PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
-
Créez un élément
- Transmettez
PendingIntent
à la notification comme d'habitude:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Pour en savoir plus sur les différentes options de tâches et sur la façon dont la pile "Retour" consultez la section Tâches et pile "Retour".