Ответ 1
Когда вы выполняете startActivity(), все, что делает, отправляет ваше намерение в очередь событий. Фактический запуск активности происходит асинхронно в ближайшем будущем. Поэтому я не вижу большой разницы между ними.
Я знаю, что получаю тот же результат с обоими фрагментами кода
finish();
startActivity(newActivity);
и
startActivity(newActivity);
finish();
Я хотел бы узнать ваше мнение, если между ними существует большая разница. Лучше другого? Если да, то почему?
Когда вы выполняете startActivity(), все, что делает, отправляет ваше намерение в очередь событий. Фактический запуск активности происходит асинхронно в ближайшем будущем. Поэтому я не вижу большой разницы между ними.
Анимация явно отличается (по крайней мере, начиная с 4.1). Вызов finish()
сначала начинает угасать первую активность раньше, и вы можете вкратце увидеть черный фон перед тем, как начнет действовать новый вид. Вызов startActivity()
сначала исчезает в новом действии поверх старого, а черный фон не видны.
Я бы сделал второй выбор, я не поддерживаю это ни на что, что я искал из официальных источников, но имеет смысл начать новую деятельность до того, как вы назовете финиш, таким образом появится новое действие с помощью намерения, и теперь фоновая активность может вызвать все его методы очистки.
Если бы вы сделали это наоборот, возможно, у намерения не будет времени на стрельбу, прежде чем очистка закончится. То есть будет ли вызов активности startActivity() после вызова finish()?
Надеюсь, вы понимаете, что я пытаюсь сформулировать, я бы сделал второй вариант, чтобы быть в безопасности.
В дополнение к ответу Эммануэля:
Оба метода startActivity
и finish
будут запланированы после конца вызывающего метода, так как оба они обрабатываются потоком пользовательского интерфейса.
У меня была аналогичная проблема:
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 обрабатывает ситуацию и показывает ее верхнюю активность, которая это б! но во втором случае все происходит нормально.
Я обычно делаю 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 по умолчанию.
Я изменил порядок, и теперь он работает без ошибок на моем телефоне.