Comment mettre une activité au premier plan (haut de la pile)?

90

Sous Android, j'ai défini une activité ExampleActivity.

Lorsque mon application a été lancée, une instance de cette A-Activity a été créée, disons qu'elle l'est A. Lorsque l'utilisateur a cliqué sur un bouton dans A, une autre instance de B-Activity, B a été créée. Maintenant, la pile de tâches est BA, avec B en haut. Ensuite, l'utilisateur a cliqué sur un bouton sur B, une autre instance de C-Activity, et C a été créé. Maintenant, la pile de tâches est CBA, avec C en haut.

Maintenant, lorsque l'utilisateur clique sur un bouton sur C, je veux que l'application amène A au premier plan, c'est-à-dire que A soit en haut de la pile de tâches, ACB.

Comment puis-je écrire le code pour y arriver?

user256239
la source

Réponses:

108

Vous pouvez essayer ceci FLAG_ACTIVITY_REORDER_TO_FRONT(le document décrit exactement ce que vous voulez)

Reno
la source
3
Je pense que ce devrait être FLAG_ACTIVITY_SINGLE_TOP .
26
@ user942821 n'aidera FLAG_ACTIVITY_SINGLE_TOPpas ici. Lorsque ActivityC est au sommet de la pile et qu'il appelle startActivity()à lancer ActivityA, même si vous le définissez, FLAG_ACTIVITY_SINGLE_TOPil créera toujours une nouvelle instance d'ActivityA. FLAG_ACTIVITY_SINGLE_TOPn'empêche la création d'une nouvelle instance que si vous essayez de lancer une activité qui se trouve déjà en haut de la pile . Dans ce cas, ActivityA n'est pas au sommet de la pile, donc Android crée une nouvelle instance.
David Wasser
6
Impressionnant! Utilisé (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)pour effacer n'importe quel historique après une donnée Activity.
shkschneider
10
FLAG_ACTIVITY_REORDER_TO_FRONT est ignoré si vous spécifiez également FLAG_ACTIVITY_CLEAR_TOP. Consultez la documentation.
Kris Subramanian
3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Cela fonctionnera très bien si vous souhaitez mettre votre activité à l'avant avec la session utilisateur si elle est déjà au-dessus de la backstack mais pas à l'avant.
Hassan Jamil
64

Le meilleur moyen que j'ai trouvé pour le faire était d'utiliser la même intention que celle utilisée par l'écran d'accueil Android - le lanceur d'applications.

Par exemple:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

De cette façon, quelle que soit l'activité de mon package qui a été la plus récemment utilisée par l'utilisateur, elle est remise au premier plan. J'ai trouvé cela utile en utilisant PendingIntent de mon service pour ramener l'utilisateur à mon application.

greg7gkb
la source
2
Merci beaucoup pour ce morceau de code. J'ai perdu des heures à essayer de faire fonctionner cela correctement.
PakitoV
3
ou sans ComponentName et setComponent, mais avec une nouvelle intention (this, MyMainActivity.class)
Tima
3
Bizarre car c'était la seule chose qui fonctionnait pour moi; la définition des indicateurs ne fonctionnait pas et recréait toujours l'activité.
Steven Huang
5
Quand je lis cette réponse et les commentaires, il est clair que nous avons un malentendu. La question initiale est de savoir comment réorganiser un Activitydans la pile de tâches. OP indique clairement qu'il veut se déplacer ActivityAdu bas de la pile vers le haut de la pile (c'est-à-dire: il veut réorganiser ActivityA vers l'avant de la pile de tâches ). Cette réponse ne fera pas cela. Cette réponse est une réponse à la question "Comment faire passer mon application (pile de tâches) de l'arrière-plan au premier plan?" C'est une question complètement différente de la question initiale d'OP.
David Wasser
3
Le bouton upvote indique également "Cette réponse est utile" et non "cette réponse est utile à l'op" - il / elle a déjà "accepter la marque" pour cette situation. De toute évidence, je ne sais pas ce qui est utile pour l'op, et à mon humble avis, le vote à la baisse des réponses basé sur mon estimation de ce qui est utile pour l'opération est incorrect.
Boris Treukhov le
28

Voici un exemple de code de la façon dont vous pouvez le faire:

Intent intent = getIntent(getApplicationContext(), A.class)

Cela garantira que vous n'avez qu'une seule instance d'une activité sur la pile.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}
Jan-Terje Sørensen
la source
11

FLAG_ACTIVITY_REORDER_TO_FRONT : s'il est défini dans un Intent passé à Context.startActivity (), cet indicateur amènera l'activité lancée à l'avant de la pile d'historique de sa tâche si elle est déjà en cours d'exécution.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
FunGapApp
la source
4

Je pense qu'une combinaison de Intentdrapeaux devrait faire l'affaire. En particulier, Intent.FLAG_ACTIVITY_CLEAR_TOPet Intent.FLAG_ACTIVITY_NEW_TASK.

Ajoutez ces indicateurs à votre intention avant d'appeler startActvity.

Al.
la source
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Remarque Votre mode de lancement homéactivité doit être single_task

sujith s
la source
1

En général, je pense que cette méthode de gestion des activités n'est pas recommandée. Le problème avec la réactivation d'une activité deux étapes plus bas dans la pile est que cette activité a probablement été tuée. Mon conseil pour vous souvenir de l'état de vos activités et les lancer avecstartActivity ()

Je suis sûr que vous avez vu cette page mais pour votre commodité, ce lien

Segfault
la source
0

Si vous souhaitez placer une activité en haut de la pile lorsque vous cliquez sur une notification, vous devrez peut-être effectuer les opérations suivantes pour que le FLAG_ACTIVITY_REORDER_TO_FRONT fonctionne:

La solution pour moi pour cela était de créer un récepteur de diffusion qui écoute les actions de diffusion que la notification déclenche. Donc en gros:

  1. La notification déclenche une action de diffusion avec en plus le nom de l'activité à lancer.

  2. Le récepteur de diffusion le détecte lorsque l'utilisateur clique sur la notification, puis crée une intention de lancer cette activité à l'aide de l'indicateur FLAG_ACTIVITY_REORDER_TO_FRONT

  3. L'activité est placée en haut de la pile d'activités, pas de doublons.

sakis kaliakoudas
la source
-2

si vous utilisez le "Message Google Cloud" pour recevoir des notifications push avec la classe "PendingIntent", le code suivant affiche la notification dans la barre d'actions uniquement.

En cliquant sur la notification, aucune activité ne sera créée, la dernière activité active est restaurée en conservant l'état actuel sans problèmes.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Ciao!

GFPF
la source