Завершите старую активность и запустите новую или наоборот

Я знаю, что я получаю тот же результат с обоими фрагментами кода

finish(); startActivity(newActivity); 

а также

 startActivity(newActivity); finish(); 

Я хотел бы узнать ваше мнение, если между ними существует большая разница. Лучше другого? Если да, то почему?

Solutions Collecting From Web of "Завершите старую активность и запустите новую или наоборот"

Когда вы выполняете startActivity (), все, что делает, отправляет ваше намерение в очередь событий. Фактический запуск активности происходит асинхронно в ближайшем будущем. Поэтому я не вижу большой разницы между ними.

Анимация явно отличается (по крайней мере, начиная с 4.1). Calling finish() сначала начинает угасать первую активность раньше, и вы можете вкратце увидеть черный фон перед тем, как startActivity() новый вид активности. Вызов startActivity() сначала исчезает в новом startActivity() поверх старого, а черный фон не видимый.

Я бы сделал второй выбор, я не поддерживаю это ни на чем, что я искал из официальных источников, но имеет смысл начать новую деятельность до того, как вы позвоните в финиш, таким образом, новое действие всплывает с намерением , И теперь фоновая активность может вызвать все методы очистки.

Если бы вы сделали это наоборот, возможно, у намерения не будет времени на стрельбу, прежде чем очистка закончится. Т.е. будет вызов активности startActivity () после вызова finish ()?

Надеюсь, вы понимаете, что я пытаюсь сказать, я бы сделал второй вариант, чтобы быть в безопасности.

В дополнение к ответу Эммануэля:

Оба метода startActivity и finish будут запланированы после завершения метода вызова, поскольку оба они обрабатываются потоком пользовательского интерфейса.

У меня была аналогичная проблема:

 Activity A: singleInstance Activity B: singleInstance Activity C: singleInstance A starts BB starts C C wants to start A: 

Здесь, если я использую:

 finish(); startActivity(A); 

Происходит что-то проводное: активность B выходит на передний план вместо A! Но если я изменил код следующим образом:

 startActivity(A); finish(); 

Все выглядит нормально, и активность A становится видимой.

Я не знаю, в чем проблема, но кажется, что в первом случае C заканчивается перед выполнением команды startActivity, так что задний стек обрабатывает ситуацию и показывает ее верхнюю активность, которая является B! Но во втором случае все происходит нормально.

Обычно я startActivity() перед finish() как я думаю, что убедитесь, что новый экран выходит до того, как предыдущий погаснет.

У меня есть страница входа в мое приложение. После успешного входа в систему активность входа в систему исчезнет, ​​и основное действие будет завершено. Он отлично работает в Android 4.

Сегодня я хотел переписать его в Material Design. Однако у меня возникла большая проблема. Новая студия Android создает пустую деятельность с материальным дизайном, который, я думаю, требует много ресурсов. Тот же процесс, но я получил ошибку

 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 

Он сказал, что мои приложения занимают много ресурсов, когда mainActivity запускается в моем logcat телефона. У меня нет ничего в mainActivity как это макет Material Design по умолчанию.

Я отменил заказ, и теперь он работает без ошибок на моем телефоне.