Ответ 1
Когда вы начинаете новое действие, текущая активность переносится на задний стек текущей задачи. (Вы можете изменить это поведение с помощью флагов и/или манифеста, но это поведение по умолчанию.) Когда пользователь нажимает на функцию возврата, верхняя активность завершается, и стек выталкивается. В результате пользователь видит, что приложение возвращается к предыдущему действию.
Совершенно нормально называть finish()
после запуска нового действия. Результатом будет то, что текущая активность (которая больше не находится в верхней части стека, так как вы только начали новую) будет удалена из стека. Затем, когда пользователь нажимает "Назад", он перейдет к предыдущему действию в фоновом стеке (или выйдет из приложения, если стек пуст).
Если вы прыгаете назад и вперед между, скажем, действиями A и B, всегда начиная новый и никогда не вызывая finish()
, это может вызвать исключение OOM, поскольку стек заполняется экземплярами каждого действия.
Подробнее об этом читайте в разделе руководства Задачи и Back Stack. В нем также описывается, как правильно справляться с циклом между действиями.