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

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?

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

L’animation est clairement différente (au moins à partir du 4.1). L’appel de 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 startActivity() . visible.

En plus des réponses Emmanuels:

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

Je ferais le deuxième choix, je ne soutiens pas ce que j’ai vu des sources officielles, mais il est plus logique de lancer la nouvelle activité avant d’appeler la fin, de cette façon la nouvelle activité apparaît 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. Est-ce que l’activité appelle 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é.

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

 Activity A: singleInstance Activity B: singleInstance Activity C: singleInstance A starts BB 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 soit terminé avant d’exécuter la commande startActivity pour que la stack arrière gère la situation et affiche son activité principale qui est B! mais dans le second cas, tout se passe normalement.

En général, je fais startActivity() avant finish() car je pense que cela startActivity() du nouvel écran 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 démarre dans mon logcat de téléphone. Je n’ai rien dans mainActivity juste que c’est la disposition de conception de matériaux par défaut.

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