web-dev-qa-db-fra.com

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

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

Lorsque mon application a été lancée, une instance de cette activité A a été créée, elle est donc A. Lorsque l'utilisateur a cliqué sur un bouton dans A, une autre instance de B-Activity, B a été créée. La pile de tâches est maintenant B-A, 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éée. Maintenant, la pile de tâches est C-B-A, avec C en haut.

Maintenant, lorsque l’utilisateur clique sur un bouton de C, je souhaite que l’application mette A au premier plan, c’est-à-dire que A soit en haut de la pile de tâches, A-C-B.

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

72
user256239

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

88
Binh Tran

Le meilleur moyen que j'ai trouvé de faire cela était d'utiliser la même intention que celle utilisée par l'écran d'accueil d'Android: l'application Launcher.

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, l’activité que l’utilisateur a utilisée le plus récemment dans mon paquet est de nouveau reprise au premier plan. J'ai trouvé cela utile dans l'utilisation de PendingIntent de mon service pour ramener l'utilisateur à mon application.

54
greg7gkb

Voici un exemple de code montrant comment vous pouvez le faire:

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

Cela garantira que vous ne disposez que d'une instance d'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;
}
21
Jan-Terje Sørensen

FLAG_ACTIVITY_REORDER_TO_FRONT : S'il est défini dans une intention transmise à Context.startActivity (), cet indicateur fera en sorte que l'activité lancée soit placée au premier plan 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);
7
FunGapApp

Je pense qu'une combinaison de Intent flags devrait faire l'affaire. En particulier, Intent.FLAG_ACTIVITY_CLEAR_TOP et Intent.FLAG_ACTIVITY_NEW_TASK.

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

4
Al.

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 pas dans The Stack est que cette activité a probablement été tuée. Mon conseil: rappelez-vous de l'état de vos activités et lancez-les avec startActivity () 

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

1
Segfault

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

La solution pour moi consistait à créer un récepteur de diffusion qui écoute les actions de diffusion déclenchées par la notification. Donc en gros:

  1. Notification déclenche une action de diffusion avec le nom supplémentaire de l'activité à lancer.

  2. Le récepteur de diffusion intercepte cette information 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 au sommet de la pile d'activités, pas de doublons.

0
sakis kaliakoudas