Подтвердить что ты не робот

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

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

finish();
startActivity(newActivity);

и

startActivity(newActivity);
finish();

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

finish();
startActivity(A);

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

startActivity(A);
finish();

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

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

Ответ 6

Я обычно делаю 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 по умолчанию.

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