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

Это хорошая идея, чтобы называть finish() после запуска новой активности в Android?

Как

startActivity(intent);
finish();

Без вызова finish() explicitly, onDestroy() не вызывается для предыдущей операции, и у меня не хватает памяти (OutOfMemory Exception).

Итак, стоит ли называть finish() explicitly to prevent OutOfMemory Exception?

4b9b3361

Ответ 1

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

Совершенно нормально называть finish() после запуска нового действия. Результатом будет то, что текущая активность (которая больше не находится в верхней части стека, так как вы только начали новую) будет удалена из стека. Затем, когда пользователь нажимает "Назад", он перейдет к предыдущему действию в фоновом стеке (или выйдет из приложения, если стек пуст).

Если вы прыгаете назад и вперед между, скажем, действиями A и B, всегда начиная новый и никогда не вызывая finish(), это может вызвать исключение OOM, поскольку стек заполняется экземплярами каждого действия.

Подробнее об этом читайте в разделе руководства Задачи и Back Stack. В нем также описывается, как правильно справляться с циклом между действиями.

Ответ 2

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

Однако я не уверен, что именно поэтому вы получаете исключение OOM, и вам, вероятно, следует выяснить, откуда это происходит. Если вы используете Bitmap, это может вызвать исключение.

Ответ 3

Это не вызов finish() после startActivity не соответствует рекомендациям Android. Ваш OutOfMemoryExecption вызван чем-то другим