web-dev-qa-db-fra.com

Terminer une ancienne activité et en commencer une nouvelle ou vice versa

Je sais que le même résultat est obtenu avec les deux extraits de code

finish();
startActivity(newActivity);

et

startActivity(newActivity);
finish();

J'aimerais connaître votre opinion, s'il y a une grande différence entre eux. Est-ce que l'un est meilleur que l'autre? Si oui, pourquoi?

63
Tima

Lorsque vous démarrez startActivity (), tout ce que vous faites est de publier votre intention dans une file d’événements. Le démarrage effectif de l'activité se produit de manière asynchrone dans un avenir proche. Donc, je ne vois pas une grande différence entre les deux. 

58
Emmanuel

L'animation est clairement différente (au moins à partir de 4.1). L'appel de finish() commence d'abord à disparaître plus tôt et vous pouvez voir brièvement un fond noir avant que la nouvelle activité ne s'affiche. Appel de startActivity() fane dans la nouvelle activité par-dessus l'ancienne et le fond noir n'est pas visible.

21
Monstieur

En plus de la réponse d'Emmanuels:

Les deux méthodes startActivity et finish seront planifiées après la fin de la méthode invoquante, car elles sont toutes deux traitées par le thread d'interface utilisateur.

9
scheffield

Je ferais le deuxième choix, je ne soutiens pas cela sur quoi que ce soit que des sources officielles me regardent, mais il est plus logique de lancer la nouvelle activité avant que vous appeliez la fin, pour que la nouvelle activité apparaisse via une intention. , et l’actuelle activité en arrière-plan peut appeler toutes ses méthodes de nettoyage.

Si vous procédiez dans le sens contraire, l’intention n’aurait peut-être pas le temps de tirer avant que le nettoyage soit terminé. C'est à dire. L'activité appellera-t-elle startActivity () après l'appel de finish ()?

J'espère que vous comprenez ce que j'essaie de dire, je ferais la deuxième option juste pour être en sécurité.

6
blindstuff

J'ai eu le même problème:

Activity A: singleInstance
Activity B: singleInstance
Activity C: singleInstance

A starts B 
B starts C
C wants to start A:

ici si j'utilise: 

finish();
startActivity(A);

il se passe quelque chose: l'activité B passe au premier plan au lieu de A! mais si je change le code comme suit:

startActivity(A);
finish();

tout semble aller et l'activité A devient visible.

Je ne sais pas quel est le problème, mais il semble que dans le premier cas, C soit terminé avant d'exécuter la commande startActivity, de sorte que la pile back gère la situation et affiche son activité principale, B! mais dans le second cas, tout se passe normalement.

1
narges

Je fais habituellement startActivity() avant finish() car je pense que cela m'assurerait que le nouvel écran sortira avant que le précédent ne s'éteigne.

J'ai une page de connexion dans mon application. Une fois l'utilisateur connecté, l'activité de connexion a disparu et l'activité principale est en hausse. Cela fonctionne très bien dans Android 4.

Aujourd'hui, j'ai voulu le réécrire dans la conception des matériaux. Cependant, j'ai un gros problème. Le nouveau studio Android crée une activité vierge avec une conception matérielle qui, selon moi, nécessite de nombreuses ressources. Le même processus, mais j'ai eu l'erreur

11-26 18:20:44.450 18397-18397/? I/Choreographer: Skipped 42 frames!  The application may be doing too much work on its main thread.
11-26 18:20:44.485 18397-18408/? I/art: Background partial concurrent mark sweep GC freed 2864(191KB) AllocSpace objects, 4(43MB) LOS objects, 13% free, 100MB/116MB, paused 8.056ms total 39.767ms

Il a indiqué que mes applications utilisent de nombreuses ressources lorsque mainActivity commence dans le journal de mon téléphone. Je n'ai rien dans mainActivity simplement que c'est la présentation par défaut de Material Design.

J'ai inversé la commande et maintenant cela fonctionne sans erreur sur mon téléphone.

0
hatted