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


Je sais que j'obtiens le même résultat avec les deux extraits de code

finish();
startActivity(newActivity);

et

startActivity(newActivity);
finish();

Je voudrais 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?


62
2017-11-15 08:56


origine


Réponses:


Lorsque vous faites startActivity (), tout ce que vous faites est de publier votre intention dans une file d'attente 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.


59
2017-11-15 15:29



L'animation est clairement différente (au moins à partir du 4.1). Appel finish() commence tout d'abord à faire disparaître la première activité plus tôt et vous pouvez voir brièvement un arrière-plan noir avant que la nouvelle activité ne s'efface. Appel startActivity() Le premier fondu dans la nouvelle activité par-dessus l’ancien et l’arrière-plan noir n’est pas visible.


19
2018-05-21 09:02



En plus des réponses Emmanuels:

Les deux méthodes startActivity et finish sera programmé après la fin de la méthode d'appel, car les deux sont traités par le thread d'interface utilisateur.


7
2017-07-03 09:13



Je ferais le second choix, je ne le soutiens pas sur les sources officielles, mais il est plus judicieux de lancer la nouvelle activité avant d'appeler la fin, de sorte que la nouvelle activité apparaisse via une intention. , et l’activité maintenant en arrière-plan peut appeler toutes ses méthodes de nettoyage.

Si vous le faites dans l'autre sens, peut-être que l'intention n'aura pas le temps de tirer avant le nettoyage. C'est à dire. l'activité appellera startActivity () après l'appel 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
2017-11-15 15:21



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);

quelque chose de câblé se produit: l'activité B arrive au premier plan au lieu de A! mais si je change le code comme ceci:

startActivity(A);
finish();

tout semble ok et l'activité A est visible.

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


1
2017-12-28 11:25



Je fais d'habitude startActivity() avant finish() comme je pense que cela ferait en sorte que le nouvel écran sort avant la sortie précédente.

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

Aujourd'hui, j'ai voulu le réécrire dans Material design. Cependant, j'ai un gros problème. Le nouveau studio Android crée une activité vierge avec une conception matérielle qui, à mon avis, 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 été dit que mes applications prennent beaucoup de ressources lorsque mainActivity commence dans mon logcat de téléphone. Je n'ai rien dans mainActivity juste que c'est la mise en page de conception de matériaux par défaut.

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


0
2017-11-26 10:47